EvEmu  0.8.4
11 September 2021
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
EvilNumber.h
Go to the documentation of this file.
1 /*
2  ------------------------------------------------------------------------------------
3  LICENSE:
4  ------------------------------------------------------------------------------------
5  This file is part of EVEmu: EVE Online Server Emulator
6  Copyright 2006 - 2021 The EVEmu Team
7  For the latest information visit https://evemu.dev
8  ------------------------------------------------------------------------------------
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU Lesser General Public License as published by the Free Software
11  Foundation; either version 2 of the License, or (at your option) any later
12  version.
13 
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
17 
18  You should have received a copy of the GNU Lesser General Public License along with
19  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
20  Place - Suite 330, Boston, MA 02111-1307, USA, or go to
21  http://www.gnu.org/copyleft/lesser.txt.
22  ------------------------------------------------------------------------------------
23  Author: Captnoord, Aknor Jaden
24  Updates: Allan
25 */
26 
27 #ifndef EvilNumber_h__
28 #define EvilNumber_h__
29 
30 #define MAX_EVIL_INTEGER 0x7FFFFFFFFFFFFFFFLL // 64-bit signed integer
31 
32 #include "eve-compat.h"
33 
34 
35 // this file should have all stuff regarding attribute caching..
37 {
41 };
42 
43 
44 class PyRep;
45 
60 {
61 
62 private:
63  double fVal;
66 
67 public:
68 
69  EvilNumber();
70  EvilNumber(int8 val);
71  EvilNumber(uint8 val);
72  EvilNumber(int16 val);
73  EvilNumber(uint16 val);
74  EvilNumber(int32 val);
75  EvilNumber(uint32 val);
76  EvilNumber(int64 val);
77  EvilNumber(float val);
78  EvilNumber(double val);
79 
80 
81  /************************************************************************/
82  /* EvilNumber manipulation operator handlers */
83  /************************************************************************/
85  { return _Multiply(*this, val); }
86 
88  { return _SelfMultiply(val); }
89 
91  { return _Divide(*this, val); }
92 
94  { return _SelfDivide(val); }
95 
97  { return _Add(*this, val); }
98 
100  { return _SelfAdd(val); }
101 
103  { return _Subtract(*this, val); }
104 
106  { return _Multiply(EvilNumber(-1.0), *this); }
107 
109  { return _SelfSubtract(val); }
110 
112  { return _Modulus(*this, val); }
113 
115  { return _SelfModulus(val); }
116 
118  { return _SelfIncrement(); }
119 
121  {
122  EvilNumber temp = *this;
123  _SelfIncrement();
124  return temp;
125  }
126 
128  { return _SelfDecrement(); }
129 
131  {
132  EvilNumber temp = *this;
133  _SelfDecrement();
134  return temp;
135  }
136 
137  /* this causes errors when enabled
138  * there are comparisons using (ENum + (float) > ENum) [mainly in ship cap/hp]
139  * this causes a return of float then tries to use '>' for which the inputs are on wrong sides
140  * will need offending code rewrote to use this system
141  * may not be worth the effort, as things are working as-is
142  */
150  /*
151  #define MATH_OPERATOR(a, b) \
152  b operator a ( b val) \
153  { \
154  if (this->mType == evil_number_int) \
155  return this->iVal a static_cast<int64>(val); \
156  else \
157  return this->fVal a static_cast<double>(val); \
158  }
159 */
166  /*
167  #define MATH_OPERATORS_FOR( type ) \
168  MATH_OPERATOR( +, type ) \
169  MATH_OPERATOR( -, type ) \
170  MATH_OPERATOR( *, type ) \
171  MATH_OPERATOR( /, type )
172  // MATH_OPERATOR( %, type )
173 */
176 /*
177  MATH_OPERATORS_FOR( const int8)
178  MATH_OPERATORS_FOR( const uint8)
179  MATH_OPERATORS_FOR( const int16)
180  MATH_OPERATORS_FOR( const uint16)
181  MATH_OPERATORS_FOR( const int32)
182  MATH_OPERATORS_FOR( const uint32)
183  MATH_OPERATORS_FOR( const int64)
184  MATH_OPERATORS_FOR( const float)
185  MATH_OPERATORS_FOR( const double)
186 */
187  /************************************************************************/
188  /* End of EvilNumber manipulation operator handlers */
189  /************************************************************************/
190 
191 
192  /************************************************************************/
193  /* EvilNumber logic operator handlers */
194  /************************************************************************/
195 
203  #define LOGIC_OPERATOR(a, b) \
204  bool operator a ( b val) \
205  { \
206  if (this->mType == evil_number_int) { \
207  return this->iVal a static_cast<int64>(val); \
208  } else if (this->mType == evil_number_float) { \
209  return this->fVal a static_cast<double>(val); \
210  } else { \
211  assert(false); \
212  return false; \
213  } \
214  }
215 
222  #define LOGIC_OPERATORS_FOR( type ) \
223  LOGIC_OPERATOR( <, type ) \
224  LOGIC_OPERATOR( <=, type ) \
225  LOGIC_OPERATOR( >, type ) \
226  LOGIC_OPERATOR( >=, type ) \
227  LOGIC_OPERATOR( ==, type ) \
228  LOGIC_OPERATOR( !=, type )
229 
230  /* using a code generating macro to generate logic operator handlers
231  * @note expand these if needed.
232  */
233  LOGIC_OPERATORS_FOR( const int8)
234  LOGIC_OPERATORS_FOR( const uint8)
235  LOGIC_OPERATORS_FOR( const int16)
237  LOGIC_OPERATORS_FOR( const int32)
239  LOGIC_OPERATORS_FOR( const int64)
240  LOGIC_OPERATORS_FOR( const float)
241  LOGIC_OPERATORS_FOR( const double)
242 
243 
251  bool operator==(const EvilNumber& val)
252  {
253  if (this->mType == evil_number_int && val.mType == evil_number_int)
254  return this->iVal == val.iVal;
255  else if (this->mType == evil_number_float && val.mType == evil_number_float)
256  return this->fVal == val.fVal;
257  else if (this->mType == evil_number_float)
258  return this->fVal == double(val.iVal);
259  else
260  return double(this->iVal) == val.fVal;
261  }
262 
263  // doesnt work when compared to 0 (num != 0)
264  bool operator!=(const EvilNumber& val)
265  {
266  if (this->mType == evil_number_int && val.mType == evil_number_int)
267  return this->iVal != val.iVal;
268  else if (this->mType == evil_number_float && val.mType == evil_number_float)
269  return this->fVal != val.fVal;
270  else if (this->mType == evil_number_float)
271  return this->fVal != double(val.iVal);
272  else
273  return double(this->iVal) != val.fVal;
274  }
275 
276  bool operator<(const EvilNumber& val)
277  {
278  if (this->mType == evil_number_int && val.mType == evil_number_int)
279  return this->iVal < val.iVal;
280  else if (this->mType == evil_number_float && val.mType == evil_number_float)
281  return this->fVal < val.fVal;
282  else if (this->mType == evil_number_float)
283  return this->fVal < double(val.iVal);
284  else
285  return double(this->iVal) < val.fVal;
286  }
287 
288  bool operator>(const EvilNumber& val)
289  {
290  if (this->mType == evil_number_int && val.mType == evil_number_int)
291  return this->iVal > val.iVal;
292  else if (this->mType == evil_number_float && val.mType == evil_number_float)
293  return this->fVal > val.fVal;
294  else if (this->mType == evil_number_float)
295  return this->fVal > double(val.iVal);
296  else
297  return double(this->iVal) > val.fVal;
298  }
299 
300  bool operator<=(const EvilNumber& val)
301  {
302  if (this->mType == evil_number_int && val.mType == evil_number_int)
303  return this->iVal <= val.iVal;
304  else if (this->mType == evil_number_float && val.mType == evil_number_float)
305  return this->fVal <= val.fVal;
306  else if (this->mType == evil_number_float)
307  return this->fVal <= double(val.iVal);
308  else
309  return double(this->iVal) <= val.fVal;
310  }
311 
312  bool operator>=(const EvilNumber& val)
313  {
314  if (this->mType == evil_number_int && val.mType == evil_number_int)
315  return this->iVal >= val.iVal;
316  else if (this->mType == evil_number_float && val.mType == evil_number_float)
317  return this->fVal >= val.fVal;
318  else if (this->mType == evil_number_float)
319  return this->fVal >= double(val.iVal);
320  else
321  return double(this->iVal) >= val.fVal;
322  }
323 
324  /************************************************************************/
325  /* End of EvilNumber logic operator handlers */
326  /************************************************************************/
327 
328 
329  /************************************************************************/
330  /* EvilNumber Mathematical functions */
331  /************************************************************************/
338  static EvilNumber sin( const EvilNumber & val );
339  static EvilNumber cos( const EvilNumber & val );
340  static EvilNumber tan( const EvilNumber & val );
341  static EvilNumber asin( const EvilNumber & val );
342  static EvilNumber acos( const EvilNumber & val );
343  static EvilNumber atan( const EvilNumber & val );
344  static EvilNumber sqrt( const EvilNumber & val );
345  static EvilNumber pow( const EvilNumber & val1, const EvilNumber & val2 );
346  static EvilNumber log( const EvilNumber & val );
347  static EvilNumber log10( const EvilNumber & val );
348  static EvilNumber exp( const EvilNumber & val );
349 
350  /************************************************************************/
351  /* End of EvilNumber Mathematical functions */
352  /************************************************************************/
353 
354 
360  std::string to_str()
361  {
362  char buff[32]; // max uint32 will result in a 10 char string, a float will result in a ? char string.
363  if (mType == evil_number_int)
364  snprintf(buff, 32, "%li", iVal);
365  else if (mType == evil_number_float)
366  snprintf(buff, 32, "%f", fVal);
367  else
368  assert(false); // bleh crash..
369  return std::string(buff);
370  }
371 
377  PyRep* GetPyObject();
378 
380 
381  bool isInt() { return ( mType == evil_number_int ); }
382  bool isFloat() { return ( mType == evil_number_float ); }
383  bool isNaN();
384  bool isInf();
385 
386  bool get_bool();
387  int64 get_int();
388  uint32 get_uint32(); // be careful with using this one...no overflow checks
389  float get_float();
390  double get_double();
391 
392 protected:
399  void CheckIntegrity();
400 
408  EvilNumber _Multiply(const EvilNumber & val1, const EvilNumber & val2);
409  EvilNumber _SelfMultiply(const EvilNumber & val);
410 
419  EvilNumber _Divide(const EvilNumber & val1, const EvilNumber & val2);
420  EvilNumber _SelfDivide(const EvilNumber & val);
421 
429  EvilNumber _Add(const EvilNumber & val1, const EvilNumber & val2);
430  EvilNumber _SelfAdd(const EvilNumber & val);
431 
439  EvilNumber _Subtract(const EvilNumber & val1, const EvilNumber & val2);
440  EvilNumber _SelfSubtract(const EvilNumber & val);
441 
449  EvilNumber _Modulus(const EvilNumber & val1, const EvilNumber & val2);
450  EvilNumber _SelfModulus(const EvilNumber & val);
451 
458 
465 };
466 
468 // global operators
469 EvilNumber operator+(const EvilNumber& val, const EvilNumber& val2);
470 EvilNumber operator-(const EvilNumber& val, const EvilNumber& val2);
471 EvilNumber operator*(const EvilNumber& val, const EvilNumber& val2);
472 EvilNumber operator/(const EvilNumber& val, const EvilNumber& val2);
473 EvilNumber operator%(const EvilNumber& val, const EvilNumber& val2);
474 
475 extern EvilNumber EvilZero;
476 extern EvilNumber EvilZerof;
477 extern EvilNumber EvilOne;
478 extern EvilNumber EvilNegOne;
479 extern const EvilNumber EvilTime_Second;
480 extern const EvilNumber EvilTime_Minute;
481 extern const EvilNumber EvilTime_Hour;
482 extern const EvilNumber EvilTime_Day;
483 extern const EvilNumber EvilTime_Month;
484 extern const EvilNumber EvilTime_Year;
485 
486 #endif // EvilNumber_h__
Base Python wire object.
Definition: PyRep.h:66
EvilNumber operator-()
Definition: EvilNumber.h:105
EvilNumber operator/(const EvilNumber &val)
Definition: EvilNumber.h:90
unsigned __int8 uint8
Definition: eve-compat.h:46
EvilNumber operator%=(const EvilNumber &val)
Definition: EvilNumber.h:114
bool operator>(const EvilNumber &val)
Definition: EvilNumber.h:288
EvilNumber _SelfMultiply(const EvilNumber &val)
Definition: EvilNumber.cpp:372
double fVal
Definition: EvilNumber.h:63
EvilNumber _Multiply(const EvilNumber &val1, const EvilNumber &val2)
multiply this with
Definition: EvilNumber.cpp:342
EVIL_NUMBER_TYPE mType
Definition: EvilNumber.h:65
bool operator!=(const EvilNumber &val)
Definition: EvilNumber.h:264
const EvilNumber EvilTime_Month
Definition: EvilNumber.cpp:40
EvilNumber operator+(const EvilNumber &val)
Definition: EvilNumber.h:96
PyRep * GetPyObject()
converts the EvilNumber into a python object.
Definition: EvilNumber.cpp:109
bool get_bool()
Definition: EvilNumber.cpp:157
EvilNumber operator*=(const EvilNumber &val)
Definition: EvilNumber.h:87
bool isInt()
Definition: EvilNumber.h:381
EvilNumber _Divide(const EvilNumber &val1, const EvilNumber &val2)
divide this with
Definition: EvilNumber.cpp:398
bool isNaN()
Definition: EvilNumber.cpp:139
this is a class that kinda mimics how python polymorph's numbers.
Definition: EvilNumber.h:59
EvilNumber operator/=(const EvilNumber &val)
Definition: EvilNumber.h:93
int64 iVal
Definition: EvilNumber.h:64
EvilNumber operator*(const EvilNumber &val)
Definition: EvilNumber.h:84
static EvilNumber exp(const EvilNumber &val)
Definition: EvilNumber.cpp:327
EVIL_NUMBER_TYPE
Definition: EvilNumber.h:36
signed __int8 int8
Definition: eve-compat.h:45
EvilNumber operator-(const EvilNumber &val, const EvilNumber &val2)
Definition: EvilNumber.cpp:656
const EvilNumber EvilTime_Minute
Definition: EvilNumber.cpp:37
static EvilNumber log10(const EvilNumber &val)
Definition: EvilNumber.cpp:315
signed __int32 int32
Definition: eve-compat.h:49
bool operator<=(const EvilNumber &val)
Definition: EvilNumber.h:300
EvilNumber _SelfAdd(const EvilNumber &val)
Definition: EvilNumber.cpp:487
EvilNumber _Subtract(const EvilNumber &val1, const EvilNumber &val2)
subtract this with
Definition: EvilNumber.cpp:514
const EvilNumber EvilTime_Year
Definition: EvilNumber.cpp:41
int64 get_int()
Definition: EvilNumber.cpp:166
static EvilNumber cos(const EvilNumber &val)
Definition: EvilNumber.cpp:212
EvilNumber operator%(const EvilNumber &val, const EvilNumber &val2)
Definition: EvilNumber.cpp:677
#define snprintf
Definition: eve-compat.h:184
uint32 get_uint32()
Definition: EvilNumber.cpp:173
static EvilNumber sqrt(const EvilNumber &val)
Definition: EvilNumber.cpp:272
EvilNumber operator--(int)
Definition: EvilNumber.h:130
static EvilNumber asin(const EvilNumber &val)
Definition: EvilNumber.cpp:236
EvilNumber operator/(const EvilNumber &val, const EvilNumber &val2)
Definition: EvilNumber.cpp:670
EvilNumber EvilNegOne
Definition: EvilNumber.cpp:35
EvilNumber _SelfSubtract(const EvilNumber &val)
Definition: EvilNumber.cpp:547
EvilNumber EvilZerof
Definition: EvilNumber.cpp:33
static EvilNumber log(const EvilNumber &val)
Definition: EvilNumber.cpp:303
EvilNumber EvilZero
Definition: EvilNumber.cpp:32
#define LOGIC_OPERATORS_FOR(type)
Code generation macro to create all comparison operator overload functions for a specified type...
Definition: EvilNumber.h:222
bool operator<(const EvilNumber &val)
Definition: EvilNumber.h:276
EvilNumber operator*(const EvilNumber &val, const EvilNumber &val2)
Definition: EvilNumber.cpp:663
EvilNumber operator++(int)
Definition: EvilNumber.h:120
const EvilNumber EvilTime_Day
Definition: EvilNumber.cpp:39
unsigned __int32 uint32
Definition: eve-compat.h:50
EvilNumber _SelfIncrement()
increment by 1
Definition: EvilNumber.cpp:636
EvilNumber operator+=(const EvilNumber &val)
Definition: EvilNumber.h:99
bool operator>=(const EvilNumber &val)
Definition: EvilNumber.h:312
static EvilNumber atan(const EvilNumber &val)
Definition: EvilNumber.cpp:260
EvilNumber _SelfModulus(const EvilNumber &val)
Definition: EvilNumber.cpp:606
EvilNumber _Add(const EvilNumber &val1, const EvilNumber &val2)
add this with
Definition: EvilNumber.cpp:456
void CheckIntegrity()
check if its possible a integer and do the conversion
Definition: EvilNumber.cpp:126
static EvilNumber sin(const EvilNumber &val)
??
Definition: EvilNumber.cpp:200
signed __int64 int64
Definition: eve-compat.h:51
EvilNumber _SelfDivide(const EvilNumber &val)
Definition: EvilNumber.cpp:428
const EvilNumber EvilTime_Hour
Definition: EvilNumber.cpp:38
static EvilNumber acos(const EvilNumber &val)
Definition: EvilNumber.cpp:248
static EvilNumber tan(const EvilNumber &val)
Definition: EvilNumber.cpp:224
double get_double()
Definition: EvilNumber.cpp:191
static EvilNumber pow(const EvilNumber &val1, const EvilNumber &val2)
Definition: EvilNumber.cpp:284
signed __int16 int16
Definition: eve-compat.h:47
EvilNumber operator++()
Definition: EvilNumber.h:117
EvilNumber operator-(const EvilNumber &val)
Definition: EvilNumber.h:102
const EvilNumber EvilTime_Second
Definition: EvilNumber.cpp:36
EvilNumber operator%(const EvilNumber &val)
Definition: EvilNumber.h:111
float get_float()
Definition: EvilNumber.cpp:184
EvilNumber _Modulus(const EvilNumber &val1, const EvilNumber &val2)
modulus this with
Definition: EvilNumber.cpp:574
EvilNumber EvilOne
Definition: EvilNumber.cpp:34
EvilNumber operator--()
Definition: EvilNumber.h:127
unsigned __int16 uint16
Definition: eve-compat.h:48
bool isInf()
Definition: EvilNumber.cpp:148
EvilNumber _SelfDecrement()
decrement by 1
Definition: EvilNumber.cpp:641
EVIL_NUMBER_TYPE get_type()
Definition: EvilNumber.h:379
std::string to_str()
converts the EvilNumber value into a string
Definition: EvilNumber.h:360
EvilNumber operator-=(const EvilNumber &val)
Definition: EvilNumber.h:108
EvilNumber operator+(const EvilNumber &val, const EvilNumber &val2)
Definition: EvilNumber.cpp:649
bool isFloat()
Definition: EvilNumber.h:382