EvEmu  0.8.4
11 September 2021
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
EvilNumber.cpp
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 #include "eve-common.h"
28 
29 #include "python/PyRep.h"
30 #include "utils/EvilNumber.h"
31 
37 const EvilNumber EvilTime_Minute = EvilTime_Second * 60;
38 const EvilNumber EvilTime_Hour = EvilTime_Minute * 60;
39 const EvilNumber EvilTime_Day = EvilTime_Hour * 24;
40 const EvilNumber EvilTime_Month = EvilTime_Day * 30;
41 const EvilNumber EvilTime_Year = EvilTime_Month * 12 + 5;
42 
43 
44 // CONSTRUCTORS:
45 
47 {
48  iVal = 0;
49  fVal = 0.0;
50 }
51 
53 {
54  iVal = val;
55  fVal = 0.0;
56 }
57 
59 {
60  iVal = val;
61  fVal = 0.0;
62 }
63 
65 {
66  iVal = val;
67  fVal = 0.0;
68 }
69 
71 {
72  iVal = val;
73  fVal = 0.0;
74 }
75 
77 {
78  iVal = val;
79  fVal = 0.0;
80 }
81 
83 {
84  iVal = val;
85  fVal = 0.0;
86 }
87 
89 {
90  iVal = val;
91  fVal = 0.0;
92 }
93 
95 {
96  fVal = val;
97  iVal = 0;
98 }
99 
101 {
102  fVal = val;
103  iVal = 0;
104 }
105 
106 
107 // PUBLIC FUNCTIONS:
108 
110 {
111  if (mType == evil_number_int) {
112  if ( iVal > INT_MAX || iVal < INT_MIN)
113  return (PyRep*)new PyLong(iVal);
114  else
115  return (PyRep*)new PyInt((int32)(iVal));
116  } else if (mType == evil_number_float) {
117  return (PyRep*)new PyFloat(fVal);
118  } else {
119  sLog.Error("EvilNumber::GetPyObject()", "EvilNumber is neither integer nor float. Returning None");
120  EvE::traceStack();
121  assert(false);
122  return PyStatic.NewNone();
123  }
124 }
125 
127 {
128  // check if we are already an integer
129  if (mType == evil_number_int)
130  return;
131  int64 cmp_val = (int64)fVal;
132  if (double(cmp_val) == fVal) {
133  iVal = cmp_val;
134  fVal = 0;
136  }
137 }
138 
140 {
141  if( mType == evil_number_nan )
142  return true;
143  if ( mType == evil_number_int )
144  return false;
145  return std::isnan(fVal);
146 }
147 
149 {
150  if ( mType == evil_number_nan )
151  return true;
152  if ( mType == evil_number_int )
153  return false;
154  return std::isinf(fVal);
155 }
156 
158 {
159  if (mType == evil_number_float)
160  return (fVal != 0.0);
161  if (mType == evil_number_int)
162  return (iVal != 0);
163  return false;
164 }
165 
167 {
168  if (mType == evil_number_float)
169  return (int64)floor(fVal);
170  return iVal;
171 }
172 
174 {
175  uint32 value(0);
176  if (mType == evil_number_float)
177  value = (uint32)floor(fVal);
178  else
179  value = (uint32)iVal;
180 
181  return value;
182 }
183 
185 {
186  if (mType == evil_number_int)
187  return (float)iVal;
188  return (float)fVal;
189 }
190 
192 {
193  if (mType == evil_number_int)
194  return (double)iVal;
195  return fVal;
196 }
197 
198 // public math functions
199 
201 {
202  EvilNumber result = EvilNumber();
203  if ( val.mType == evil_number_float )
204  result.fVal = std::sin( val.fVal );
205  else
206  result.fVal = std::sin( (double)(val.iVal) );
207 
208  result.mType = evil_number_float;
209  return result;
210 }
211 
213 {
214  EvilNumber result = EvilNumber();
215  if ( val.mType == evil_number_float )
216  result.fVal = std::cos( val.fVal );
217  else
218  result.fVal = std::cos( (double)(val.iVal) );
219 
220  result.mType = evil_number_float;
221  return result;
222 }
223 
225 {
226  EvilNumber result = EvilNumber();
227  if ( val.mType == evil_number_float )
228  result.fVal = std::tan( val.fVal );
229  else
230  result.fVal = std::tan( (double)(val.iVal) );
231 
232  result.mType = evil_number_float;
233  return result;
234 }
235 
237 {
238  EvilNumber result = EvilNumber();
239  if ( val.mType == evil_number_float )
240  result.fVal = std::asin( val.fVal );
241  else
242  result.fVal = std::asin( (double)(val.iVal) );
243 
244  result.mType = evil_number_float;
245  return result;
246 }
247 
249 {
250  EvilNumber result = EvilNumber();
251  if ( val.mType == evil_number_float )
252  result.fVal = std::acos( val.fVal );
253  else
254  result.fVal = std::acos( (double)(val.iVal) );
255 
256  result.mType = evil_number_float;
257  return result;
258 }
259 
261 {
262  EvilNumber result = EvilNumber();
263  if ( val.mType == evil_number_float )
264  result.fVal = std::atan( val.fVal );
265  else
266  result.fVal = std::atan( (double)(val.iVal) );
267 
268  result.mType = evil_number_float;
269  return result;
270 }
271 
273 {
274  EvilNumber result = EvilNumber();
275  if ( val.mType == evil_number_float )
276  result.fVal = std::sqrt( val.fVal );
277  else
278  result.fVal = std::sqrt( (double)(val.iVal) );
279 
280  result.mType = evil_number_float;
281  return result;
282 }
283 
284 EvilNumber EvilNumber::pow( const EvilNumber & val1, const EvilNumber & val2 )
285 {
286  EvilNumber exponent = EvilNumber();
287  EvilNumber result = EvilNumber();
288  if ( val2.mType == evil_number_float )
289  exponent.fVal = val2.fVal;
290  else
291  exponent.fVal = (double)(val2.iVal);
292  exponent.mType = evil_number_float;
293 
294  if( val1.mType == evil_number_float )
295  result.fVal = std::pow( val1.fVal, exponent.fVal );
296  else
297  result.fVal = std::pow( (double)(val1.iVal), exponent.fVal );
298 
299  result.mType = evil_number_float;
300  return result;
301 }
302 
304 {
305  EvilNumber result = EvilNumber();
306  if ( val.mType == evil_number_float )
307  result.fVal = std::log( val.fVal );
308  else
309  result.fVal = std::log( (double)(val.iVal) );
310 
311  result.mType = evil_number_float;
312  return result;
313 }
314 
316 {
317  EvilNumber result = EvilNumber();
318  if ( val.mType == evil_number_float )
319  result.fVal = std::log10( val.fVal );
320  else
321  result.fVal = std::log10( (double)(val.iVal) );
322 
323  result.mType = evil_number_float;
324  return result;
325 }
326 
328 {
329  EvilNumber result = EvilNumber();
330  if ( val.mType == evil_number_float )
331  result.fVal = std::exp( val.fVal );
332  else
333  result.fVal = std::exp( (double)(val.iVal) );
334 
335  result.mType = evil_number_float;
336  return result;
337 }
338 
339 
340 // PRIVATE FUNCTIONS:
341 
343 {
344  EvilNumber result = EvilNumber();
345  // WARNING! There should be NO implicit or explicit use of the 'this' pointer here!
346  if (val2.mType == val1.mType) {
347  if (val1.mType == evil_number_float) {
348  result.fVal = val1.fVal * val2.fVal;
349  result.mType = evil_number_float;
350  } else if (val1.mType == evil_number_int) {
351  result.iVal = val1.iVal * val2.iVal;
352  result.mType = evil_number_int;
353  } else {
354  assert(false); // crash
355  }
356  } else {
357  // we assume that the val1 argument type is the opposite of the val2 argument type
358  if (val1.mType == evil_number_float) {
359  result.fVal = val1.fVal * val2.iVal;
360  } else if (val1.mType == evil_number_int) {
361  result.fVal = val2.fVal * val1.iVal;
362  } else {
363  assert(false); // crash
364  }
365  result.mType = evil_number_float;
366  }
367  //result.CheckIntegrity();
368 
369  return result;
370 }
371 
373 {
374  if (val.mType == mType) {
375  if (mType == evil_number_float) {
376  this->fVal = this->fVal * val.fVal;
377  } else if (mType == evil_number_int) {
378  this->iVal = this->iVal * val.iVal;
379  } else {
380  assert(false); // crash
381  }
382  } else {
383  // we assume that the val argument is the opposite of the 'this' type
384  if (mType == evil_number_float) {
385  this->fVal = this->fVal * val.iVal;
386  } else if (mType == evil_number_int) {
387  this->fVal = val.fVal * iVal;
389  } else {
390  assert(false); // crash
391  }
392  }
393  // CheckIntegrity();
394 
395  return *this;
396 }
397 
399 {
400  EvilNumber result = EvilNumber();
401 
402  // WARNING! There should be NO implicit or explicit use of the 'this' pointer here!
403  if (val2.mType == val1.mType) {
404  if (val1.mType == evil_number_float) {
405  result.fVal = val1.fVal / val2.fVal;
406  } else if (val1.mType == evil_number_int) {
407  // make sure we can do things like 2 / 4 = 0.5f
408  result.fVal = double(val1.iVal) / double(val2.iVal);
409  } else {
410  assert(false); // crash
411  }
412  } else {
413  // we assume that the val1 argument type is the opposite of the val2 argument type
414  if (val1.mType == evil_number_float) {
415  result.fVal = val1.fVal / val2.iVal;
416  } else if (val1.mType == evil_number_int) {
417  result.fVal = val1.iVal / val2.fVal;
418  } else {
419  assert(false); // crash
420  }
421  }
422  result.mType = evil_number_float;
423  // result.CheckIntegrity();
424 
425  return result;
426 }
427 
429 {
430  if (val.mType == mType) {
431  if (mType == evil_number_float) {
432  this->fVal = this->fVal / val.fVal;
433  } else if (mType == evil_number_int) {
434  // make sure we can do things like 2 / 4 = 0.5f
435  this->fVal = double(this->iVal) / double(val.iVal);
437  } else {
438  assert(false); // crash
439  }
440  } else {
441  // we assume that the val argument is the opposite of the 'this' type
442  if (mType == evil_number_float) {
443  this->fVal = this->fVal / val.iVal;
444  } else if (mType == evil_number_int) {
445  this->fVal = iVal / val.fVal;
447  } else {
448  assert(false); // crash
449  }
450  }
451  //CheckIntegrity();
452 
453  return *this;
454 }
455 
456 EvilNumber EvilNumber::_Add( const EvilNumber & val1, const EvilNumber & val2 )
457 {
458  EvilNumber result = EvilNumber();
459 
460  // WARNING! There should be NO implicit or explicit use of the 'this' pointer here!
461  if (val2.mType == val1.mType) {
462  if (val1.mType == evil_number_float) {
463  result.fVal = val1.fVal + val2.fVal;
464  result.mType = evil_number_float;
465  } else if (val1.mType == evil_number_int) {
466  result.iVal = val1.iVal + val2.iVal;
467  result.mType = evil_number_int;
468  } else {
469  assert(false); // crash
470  }
471  } else {
472  // we assume that the val argument is the opposite of the 'this' type
473  if (val1.mType == evil_number_float) {
474  result.fVal = val1.fVal + val2.iVal;
475  } else if (val1.mType == evil_number_int) {
476  result.fVal = val1.iVal + val2.fVal;
477  } else {
478  assert(false); // crash
479  }
480  result.mType = evil_number_float;
481  }
482  //result.CheckIntegrity();
483 
484  return result;
485 }
486 
488 {
489  if (val.mType == mType) {
490  if (mType == evil_number_float) {
491  this->fVal = this->fVal + val.fVal;
492  } else if (mType == evil_number_int) {
493  this->iVal = this->iVal + val.iVal;
494  } else {
495  assert(false); // crash
496  }
497  } else {
498  // we assume that the val argument is the opposite of the 'this' type
499  if (mType == evil_number_float) {
500  this->fVal = this->fVal + double(val.iVal);
501  } else if (mType == evil_number_int) {
502  double tVal = (double)iVal; // normal integer number
503  this->fVal = tVal + val.fVal;
505  } else {
506  assert(false); // crash
507  }
508  }
509  //CheckIntegrity();
510 
511  return *this;
512 }
513 
515 {
516  EvilNumber result = EvilNumber();
517 
518  // WARNING! There should be NO implicit or explicit use of the 'this' pointer here!
519  if (val2.mType == val1.mType) {
520  if (val1.mType == evil_number_float) {
521  result.fVal = val1.fVal - val2.fVal;
522  result.mType = evil_number_float;
523  } else if (val1.mType == evil_number_int) {
524  result.iVal = val1.iVal - val2.iVal;
525  result.mType = evil_number_int;
526  } else {
527  assert(false); // crash
528  }
529  } else {
530  // we assume that the val argument is the opposite of the 'this' type
531  if (val1.mType == evil_number_float) {
532  result.fVal = val1.fVal - double(val2.iVal);
533  result.mType = evil_number_float;
534  } else if (val1.mType == evil_number_int) {
535  double tVal = (double)val1.iVal; // normal integer number
536  result.fVal = tVal - val2.fVal;
537  result.mType = evil_number_float;
538  } else {
539  assert(false); // crash
540  }
541  }
542  //result.CheckIntegrity();
543 
544  return result;
545 }
546 
548 {
549  if (val.mType == mType) {
550  if (mType == evil_number_float) {
551  this->fVal = this->fVal - val.fVal;
552  } else if (mType == evil_number_int) {
553  this->iVal = this->iVal - val.iVal;
554  } else {
555  assert(false); // crash
556  }
557  } else {
558  // we assume that the val argument is the opposite of the 'this' type
559  if (mType == evil_number_float) {
560  this->fVal = this->fVal - double(val.iVal);
561  } else if (mType == evil_number_int) {
562  double tVal = (double)iVal; // normal integer number
563  this->fVal = tVal - val.fVal;
565  } else {
566  assert(false); // crash
567  }
568  }
569  //CheckIntegrity();
570 
571  return *this;
572 }
573 
575 {
576  EvilNumber result = EvilNumber();
577 
578  // WARNING! There should be NO implicit or explicit use of the 'this' pointer here!
579  if (val2.mType == val1.mType) {
580  if (val1.mType == evil_number_float) {
581  result.iVal = (int64)(val1.fVal) % (int64)(val2.fVal);
582  result.mType = evil_number_int;
583  } else if (val1.mType == evil_number_int) {
584  result.iVal = val1.iVal % val2.iVal;
585  result.mType = evil_number_int;
586  } else {
587  assert(false); // crash
588  }
589  } else {
590  // we assume that the val1 argument type is the opposite of the val2 argument type
591  if (val1.mType == evil_number_float) {
592  result.iVal = (int64)(val1.fVal) % val2.iVal;
593  result.mType = evil_number_int;
594  } else if (val1.mType == evil_number_int) {
595  result.iVal = val1.iVal % (int64)(val2.fVal);
596  result.mType = evil_number_int;
597  } else {
598  assert(false); // crash
599  }
600  }
601  // result.CheckIntegrity();
602 
603  return result;
604 }
605 
607 {
608  if (val.mType == mType) {
609  if (mType == evil_number_float) {
610  this->iVal = (int64)(this->fVal) % (int64)(val.fVal);
612  } else if (mType == evil_number_int) {
613  this->iVal = this->iVal % val.iVal;
615  } else {
616  assert(false); // crash
617  }
618 
619  } else {
620  // we assume that the val argument is the opposite of the 'this' type
621  if (mType == evil_number_float) {
622  this->iVal = (int64)(this->fVal) % val.iVal;
624  } else if (mType == evil_number_int) {
625  this->iVal = this->iVal % (int64)(val.fVal);
627  } else {
628  assert(false); // crash
629  }
630  }
631  // CheckIntegrity();
632 
633  return *this;
634 }
635 
637 {
638  return _SelfAdd(EvilOne);
639 }
640 
642 {
643  return _SelfSubtract(EvilOne);
644 }
645 
646 
647 // GLOBAL FUNCTIONS:
648 
649 EvilNumber operator+(const EvilNumber& val, const EvilNumber& val2)
650 {
651  EvilNumber result(val);
652  result += val2;
653  return result;
654 }
655 
656 EvilNumber operator-(const EvilNumber& val, const EvilNumber& val2)
657 {
658  EvilNumber result(val);
659  result -= val2;
660  return result;
661 }
662 
663 EvilNumber operator*(const EvilNumber& val, const EvilNumber& val2)
664 {
665  EvilNumber result(val);
666  result *= val2;
667  return result;
668 }
669 
670 EvilNumber operator/(const EvilNumber& val, const EvilNumber& val2)
671 {
672  EvilNumber result(val);
673  result /= val2;
674  return result;
675 }
676 
677 EvilNumber operator%(const EvilNumber& val, const EvilNumber& val2)
678 {
679  EvilNumber result(val);
680  result %= val2;
681  return result;
682 }
Base Python wire object.
Definition: PyRep.h:66
unsigned __int8 uint8
Definition: eve-compat.h:46
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
EvilNumber EvilZerof
Definition: EvilNumber.cpp:33
PyRep * GetPyObject()
converts the EvilNumber into a python object.
Definition: EvilNumber.cpp:109
bool get_bool()
Definition: EvilNumber.cpp:157
Python floating point number.
Definition: PyRep.h:292
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
int64 iVal
Definition: EvilNumber.h:64
EvilNumber EvilNegOne
Definition: EvilNumber.cpp:35
static EvilNumber exp(const EvilNumber &val)
Definition: EvilNumber.cpp:327
signed __int8 int8
Definition: eve-compat.h:45
const EvilNumber EvilTime_Month
Definition: EvilNumber.cpp:40
EvilNumber EvilZero
Definition: EvilNumber.cpp:32
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
#define sLog
Evaluates to a NewLog instance.
Definition: LogNew.h:250
const EvilNumber EvilTime_Hour
Definition: EvilNumber.cpp:38
EvilNumber _SelfAdd(const EvilNumber &val)
Definition: EvilNumber.cpp:487
EvilNumber operator+(const EvilNumber &val, const EvilNumber &val2)
Definition: EvilNumber.cpp:649
EvilNumber _Subtract(const EvilNumber &val1, const EvilNumber &val2)
subtract this with
Definition: EvilNumber.cpp:514
EvilNumber operator/(const EvilNumber &val, const EvilNumber &val2)
Definition: EvilNumber.cpp:670
EvilNumber operator-(const EvilNumber &val, const EvilNumber &val2)
Definition: EvilNumber.cpp:656
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
uint32 get_uint32()
Definition: EvilNumber.cpp:173
static EvilNumber sqrt(const EvilNumber &val)
Definition: EvilNumber.cpp:272
Python integer.
Definition: PyRep.h:231
static EvilNumber asin(const EvilNumber &val)
Definition: EvilNumber.cpp:236
EvilNumber _SelfSubtract(const EvilNumber &val)
Definition: EvilNumber.cpp:547
#define PyStatic
Definition: PyRep.h:1209
static EvilNumber log(const EvilNumber &val)
Definition: EvilNumber.cpp:303
unsigned __int32 uint32
Definition: eve-compat.h:50
EvilNumber _SelfIncrement()
increment by 1
Definition: EvilNumber.cpp:636
const EvilNumber EvilTime_Second
Definition: EvilNumber.cpp:36
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
EvilNumber operator*(const EvilNumber &val, const EvilNumber &val2)
Definition: EvilNumber.cpp:663
const EvilNumber EvilTime_Day
Definition: EvilNumber.cpp:39
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
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
const EvilNumber EvilTime_Year
Definition: EvilNumber.cpp:41
void traceStack(void)
Definition: misc.cpp:169
EvilNumber EvilOne
Definition: EvilNumber.cpp:34
float get_float()
Definition: EvilNumber.cpp:184
EvilNumber _Modulus(const EvilNumber &val1, const EvilNumber &val2)
modulus this with
Definition: EvilNumber.cpp:574
unsigned __int16 uint16
Definition: eve-compat.h:48
bool isInf()
Definition: EvilNumber.cpp:148
EvilNumber _SelfDecrement()
decrement by 1
Definition: EvilNumber.cpp:641
Python long integer.
Definition: PyRep.h:261