Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/network64/src/network/synchronisable/SynchronisableVariable.cc @ 2245

Last change on this file since 2245 was 2245, checked in by scheusso, 16 years ago

most coding is done, still testing now
types should get transfered in platform independent formats now

  • Property svn:eol-style set to native
File size: 11.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 *      Oliver Scheuss, (C) 2008
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "SynchronisableVariable.h"
30#include <cstring>
31#include "util/Math.h"
32
33
34namespace orxonox{
35
36uint8_t SynchronisableVariableBase::state_ = 0;
37
38
39
40// =================== Template specialisation stuff =============
41
42// =========== bool
43
44template <> uint32_t SynchronisableVariable<const bool>::returnSize()
45{
46  return sizeof(uint8_t);
47}
48
49template <> void SynchronisableVariable<const bool>::setAndIncrease( uint8_t*& mem )
50{
51  *(uint8_t*)(&this->variable_) = *static_cast<uint8_t*>(mem);
52  mem += SynchronisableVariable<const bool>::returnSize();
53}
54
55template <> void SynchronisableVariable<const bool>::getAndIncrease( uint8_t*& mem )
56{
57  *static_cast<uint8_t*>(mem) = *(uint8_t*)(&this->variable_);
58  mem += SynchronisableVariable<const bool>::returnSize();
59}
60
61template <> bool SynchronisableVariable<const bool>::checkEquality( uint8_t* mem )
62{
63  return *static_cast<uint8_t*>(mem) == *(uint8_t*)(&this->variable_);
64}
65
66// =========== unsigned char
67
68template <> uint32_t SynchronisableVariable<const unsigned char>::returnSize()
69{
70  return sizeof(uint8_t);
71}
72
73template <> void SynchronisableVariable<const unsigned char>::setAndIncrease( uint8_t*& mem )
74{
75  *(uint8_t*)(&this->variable_) = *static_cast<uint8_t*>(mem);
76  mem += SynchronisableVariable<const unsigned char>::returnSize();
77}
78
79template <> void SynchronisableVariable<const unsigned char>::getAndIncrease( uint8_t*& mem )
80{
81  *static_cast<uint8_t*>(mem) = *(uint8_t*)(&this->variable_);
82  mem += SynchronisableVariable<const unsigned char>::returnSize();
83}
84
85template <> bool SynchronisableVariable<const unsigned char>::checkEquality( uint8_t* mem )
86{
87  return *static_cast<uint8_t*>(mem) == *(uint8_t*)(&this->variable_);
88}
89
90// =========== short
91
92template <> uint32_t SynchronisableVariable<const short>::returnSize()
93{
94  return sizeof(int16_t);
95}
96
97template <> void SynchronisableVariable<const short>::setAndIncrease( uint8_t*& mem )
98{
99  *(short*)(&this->variable_) = *(int16_t*)(mem);
100  mem += SynchronisableVariable<const short>::returnSize();
101}
102
103template <> void SynchronisableVariable<const short>::getAndIncrease( uint8_t*& mem )
104{
105  *(int16_t*)(mem) = this->variable_;
106  mem += SynchronisableVariable<const short>::returnSize();
107}
108
109template <> bool SynchronisableVariable<const short>::checkEquality( uint8_t* mem )
110{
111  return *(int16_t*)(mem) == static_cast<int16_t>(this->variable_);
112}
113
114// =========== unsigned short
115
116template <> uint32_t SynchronisableVariable<const unsigned short>::returnSize()
117{
118  return sizeof(uint16_t);
119}
120
121template <> void SynchronisableVariable<const unsigned short>::setAndIncrease( uint8_t*& mem )
122{
123  *(unsigned short*)(&this->variable_) = *(uint16_t*)(mem);
124  mem += SynchronisableVariable<const unsigned short>::returnSize();
125}
126
127template <> void SynchronisableVariable<const unsigned short>::getAndIncrease( uint8_t*& mem )
128{
129  *(uint16_t*)(mem) = this->variable_;
130  mem += SynchronisableVariable<const unsigned short>::returnSize();
131}
132
133template <> bool SynchronisableVariable<const unsigned short>::checkEquality( uint8_t* mem )
134{
135  return *(uint16_t*)(mem) == this->variable_;
136}
137
138// =========== int
139
140template <> uint32_t SynchronisableVariable<const int>::returnSize()
141{
142  return sizeof(int32_t);
143}
144
145template <> void SynchronisableVariable<const int>::setAndIncrease( uint8_t*& mem )
146{
147  *(int *)(&this->variable_) = *(int32_t*)(mem);
148  mem += SynchronisableVariable<const int>::returnSize();
149}
150
151template <> void SynchronisableVariable<const int>::getAndIncrease( uint8_t*& mem )
152{
153  *(int32_t*)(mem) = this->variable_;
154  mem += SynchronisableVariable<const int>::returnSize();
155}
156
157template <> bool SynchronisableVariable<const int>::checkEquality( uint8_t* mem )
158{
159  return *(int32_t*)(mem) == this->variable_;
160}
161
162// =========== unsigned int
163
164template <> uint32_t SynchronisableVariable<const unsigned int>::returnSize()
165{
166  return sizeof(uint32_t);
167}
168   
169template <> void SynchronisableVariable<const unsigned int>::setAndIncrease( uint8_t*& mem )
170{
171  *(unsigned int*)(&this->variable_) = *(uint32_t*)(mem);
172  mem += SynchronisableVariable<const unsigned int>::returnSize();
173}
174
175template <> void SynchronisableVariable<const unsigned int>::getAndIncrease( uint8_t*& mem )
176{
177  *(uint32_t*)(mem) = this->variable_;
178  mem += SynchronisableVariable<const unsigned int>::returnSize();
179}
180
181template <> bool SynchronisableVariable<const unsigned int>::checkEquality( uint8_t* mem )
182{
183  return *(uint32_t*)(mem) == this->variable_;
184}
185
186// =========== long
187
188template <> uint32_t SynchronisableVariable<const long>::returnSize()
189{
190  return sizeof(int32_t);
191}
192
193template <> void SynchronisableVariable<const long>::setAndIncrease( uint8_t*& mem )
194{
195  *(long*)(&this->variable_) = *(int32_t*)(mem);
196  mem += SynchronisableVariable<const long>::returnSize();
197}
198
199template <> void SynchronisableVariable<const long>::getAndIncrease( uint8_t*& mem )
200{
201  *(int32_t*)(mem) = this->variable_;
202  mem += SynchronisableVariable<const long>::returnSize();
203}
204
205template <> bool SynchronisableVariable<const long>::checkEquality( uint8_t* mem )
206{
207  return *(int32_t*)(mem) == this->variable_;
208}
209
210// =========== unsigned long
211
212template <> uint32_t SynchronisableVariable<const unsigned long>::returnSize()
213{
214  return sizeof(uint32_t);
215}
216
217template <> void SynchronisableVariable<const unsigned long>::setAndIncrease( uint8_t*& mem )
218{
219  *(unsigned long*)(&this->variable_) = *(uint32_t*)(mem);
220  mem += SynchronisableVariable<const unsigned long>::returnSize();
221}
222
223template <> void SynchronisableVariable<const unsigned long>::getAndIncrease( uint8_t*& mem )
224{
225  *(uint32_t*)(mem) = this->variable_;
226  mem += SynchronisableVariable<const unsigned long>::returnSize();
227}
228
229template <> bool SynchronisableVariable<const unsigned long>::checkEquality( uint8_t* mem )
230{
231  return *(uint32_t*)(mem) == this->variable_;
232}
233
234// =========== long long
235
236template <> uint32_t SynchronisableVariable<const long long>::returnSize()
237{
238  return sizeof(int64_t);
239}
240
241template <> void SynchronisableVariable<const long long>::setAndIncrease( uint8_t*& mem )
242{
243  *(long long*)(&this->variable_) = *(int64_t*)(mem);
244  mem += SynchronisableVariable<const long long>::returnSize();
245}
246
247template <> void SynchronisableVariable<const long long>::getAndIncrease( uint8_t*& mem )
248{
249  *(int64_t*)(mem) = this->variable_;
250  mem += SynchronisableVariable<const long long>::returnSize();
251}
252
253template <> bool SynchronisableVariable<const long long>::checkEquality( uint8_t* mem )
254{
255  return *(int64_t*)(mem) == this->variable_;
256}
257
258// =========== unsigned long long
259
260template <> uint32_t SynchronisableVariable<const unsigned long long>::returnSize()
261{
262  return sizeof(uint64_t);
263}
264
265template <> void SynchronisableVariable<const unsigned long long>::setAndIncrease( uint8_t*& mem )
266{
267  *(unsigned long long*)(&this->variable_) = *(uint64_t*)(mem);
268  mem += SynchronisableVariable<const unsigned long long>::returnSize();
269}
270
271template <> void SynchronisableVariable<const unsigned long long>::getAndIncrease( uint8_t*& mem )
272{
273  *(uint64_t*)(mem) = this->variable_;
274  mem += SynchronisableVariable<const unsigned long long>::returnSize();
275}
276
277template <> bool SynchronisableVariable<const unsigned long long>::checkEquality( uint8_t* mem )
278{
279  return *(uint64_t*)(mem) == this->variable_;
280}
281
282// =========== float
283
284template <> uint32_t SynchronisableVariable<const float>::returnSize()
285{
286  return sizeof(uint32_t);
287}
288
289template <> void SynchronisableVariable<const float>::setAndIncrease( uint8_t*& mem )
290{
291  *(uint32_t*)(&this->variable_) = *(uint32_t*)(mem);
292  mem += SynchronisableVariable<const float>::returnSize();
293}
294
295template <> void SynchronisableVariable<const float>::getAndIncrease( uint8_t*& mem )
296{
297  *(uint32_t*)(mem) = *(uint32_t*)(&this->variable_);
298  mem += SynchronisableVariable<const float>::returnSize();
299}
300
301template <> bool SynchronisableVariable<const float>::checkEquality( uint8_t* mem )
302{
303  return *(uint32_t*)(mem) == *(uint32_t*)(&this->variable_);
304}
305
306// =========== double
307
308template <> uint32_t SynchronisableVariable<const double>::returnSize()
309{
310  return sizeof(uint64_t);
311}
312
313template <> void SynchronisableVariable<const double>::setAndIncrease( uint8_t*& mem )
314{
315  *(uint64_t*)(&this->variable_) = *(uint64_t*)(mem);
316  mem += SynchronisableVariable<const double>::returnSize();
317}
318
319template <> void SynchronisableVariable<const double>::getAndIncrease( uint8_t*& mem )
320{
321  *(uint64_t*)(mem) = *(uint64_t*)(&this->variable_);
322  mem += SynchronisableVariable<const double>::returnSize();
323}
324
325template <> bool SynchronisableVariable<const double>::checkEquality( uint8_t* mem )
326{
327  return *(uint64_t*)(mem) == *(uint64_t*)(&this->variable_);
328}
329
330// =========== long double
331
332template <> uint32_t SynchronisableVariable<const long double>::returnSize()
333{
334  return sizeof(uint64_t);
335}
336
337template <> void SynchronisableVariable<const long double>::setAndIncrease( uint8_t*& mem )
338{
339  double temp;
340  *(uint64_t*)(&temp) = *(uint64_t*)(mem);
341  *(long double*)(&this->variable_) = static_cast<const long double>(temp);
342  mem += SynchronisableVariable<const long double>::returnSize();
343}
344
345template <> void SynchronisableVariable<const long double>::getAndIncrease( uint8_t*& mem )
346{
347  double temp = static_cast<double>(this->variable_);
348  *(uint64_t*)(mem) = *(uint64_t*)(&temp);
349  mem += SynchronisableVariable<const long double>::returnSize();
350}
351
352template <> bool SynchronisableVariable<const long double>::checkEquality( uint8_t* mem )
353{
354  double temp = static_cast<double>(this->variable_);
355  return *(uint64_t*)(mem) == *(uint64_t*)(&temp);
356}
357
358// =========== string
359
360template <> uint32_t SynchronisableVariable<const std::string>::returnSize()
361{
362  return variable_.length()+1;
363}
364
365template <> void SynchronisableVariable<const std::string>::getAndIncrease( uint8_t*& mem )
366{
367  memcpy(mem, this->variable_.c_str(), this->variable_.length()+1);
368  mem += this->variable_.length()+1;
369}
370
371template <> void SynchronisableVariable<const std::string>::setAndIncrease( uint8_t*& mem )
372{
373  *(std::string*)(&this->variable_) = std::string((const char *)mem);
374  mem += this->variable_.length()+1;
375}
376
377template <> bool SynchronisableVariable<const std::string>::checkEquality( uint8_t* mem )
378{
379  return std::string((const char*)mem)==this->variable_;
380}
381
382// =========== Degree
383
384template <> uint32_t SynchronisableVariable<const Degree>::returnSize()
385{
386  return sizeof(Ogre::Real);
387}
388
389template <> void SynchronisableVariable<const Degree>::getAndIncrease( uint8_t*& mem )
390{
391  Ogre::Real r = this->variable_.valueDegrees();
392  memcpy(mem, &r, returnSize());
393  mem += returnSize();
394}
395
396template <> void SynchronisableVariable<const Degree>::setAndIncrease( uint8_t*& mem )
397{
398  Ogre::Real* r = (Ogre::Real*)mem;
399  static_cast<Degree>(this->variable_) = *r;
400  mem += returnSize();
401}
402
403template <> bool SynchronisableVariable<const Degree>::checkEquality( uint8_t* mem )
404{
405  Ogre::Real* r = (Ogre::Real*)mem;
406  return this->variable_==Degree(*r);
407}
408
409}
Note: See TracBrowser for help on using the repository browser.