Calculate.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /******************************************************************************
  2. Use 'Calculate' functions to calculate string expressions and convert them to values.
  3. Sample Usage:
  4. Flt result=CalculateF("2*3");
  5. /******************************************************************************/
  6. enum CVAL_TYPE : Byte // Calculator Value Type
  7. {
  8. CVAL_NONE, // none
  9. CVAL_INT , // integer
  10. CVAL_REAL, // real
  11. CVAL_VEC2, // vector 2D
  12. CVAL_VEC , // vector 3D
  13. CVAL_VEC4, // vector 4D
  14. };
  15. /******************************************************************************/
  16. struct CalcValue // Calculator Value
  17. {
  18. CVAL_TYPE type; // value type
  19. union
  20. {
  21. Long i ; // CVAL_INT
  22. Dbl r ; // CVAL_REAL
  23. VecD2 v2; // CVAL_VEC2
  24. VecD v ; // CVAL_VEC
  25. VecD4 v4; // CVAL_VEC4
  26. };
  27. // get
  28. CChar8* typeName( )C; // get CVAL_TYPE type name in text format
  29. Str asText (Int precision=INT_MAX)C; // get value as text
  30. Int asInt ( )C; // get value as Int , 0 on fail
  31. UInt asUInt ( )C; // get value as UInt , 0 on fail
  32. Long asLong ( )C; // get value as Long , 0 on fail
  33. ULong asULong ( )C; // get value as ULong, 0 on fail
  34. Flt asFlt ( )C; // get value as Flt , 0 on fail
  35. Dbl asDbl ( )C; // get value as Dbl , 0 on fail
  36. Vec2 asVec2 ( )C; // get value as Vec2 , (0,0) on fail
  37. VecD2 asVecD2 ( )C; // get value as VecD2, (0,0) on fail
  38. VecI2 asVecI2 ( )C; // get value as VecI2, (0,0) on fail
  39. Vec asVec ( )C; // get value as Vec , (0,0,0) on fail
  40. VecD asVecD ( )C; // get value as VecD , (0,0,0) on fail
  41. VecI asVecI ( )C; // get value as VecI , (0,0,0) on fail
  42. Vec4 asVec4 ( )C; // get value as Vec4 , (0,0,0,0) on fail
  43. VecD4 asVecD4 ( )C; // get value as VecD4, (0,0,0,0) on fail
  44. VecI4 asVecI4 ( )C; // get value as VecI4, (0,0,0,0) on fail
  45. #if EE_PRIVATE
  46. // operations, false on fail
  47. Bool notLogical(); // !
  48. Bool notBitwise(); // ~
  49. Bool chs (); // change sign
  50. Bool abs (); // absolute value
  51. Bool sign (); // sign
  52. Bool sat( ); // saturate
  53. Bool min(C CalcValue &x); // minimum
  54. Bool max(C CalcValue &x); // maximum
  55. Bool avg(C CalcValue &x); // average
  56. Bool add(C CalcValue &x); // add
  57. Bool sub(C CalcValue &x); // subtract
  58. Bool mul(C CalcValue &x); // multiply
  59. Bool div(C CalcValue &x); // divide
  60. Bool mod(C CalcValue &x); // modulo
  61. Bool sqr ( ); // square
  62. Bool cube( ); // cube
  63. Bool sqrt( ); // square root
  64. Bool cbrt( ); // cube root
  65. Bool pow (C CalcValue &x); // power
  66. Bool ln ( ); // e-base logarithm
  67. Bool log2( ); // 2-base logarithm
  68. Bool log (C CalcValue &x); // x-base logarithm
  69. Bool And(C CalcValue &x); // &
  70. Bool Or (C CalcValue &x); // |
  71. Bool Xor(C CalcValue &x); // ^
  72. Bool shl(C CalcValue &x); // <<
  73. Bool shr(C CalcValue &x); // >>
  74. Bool rol(C CalcValue &x); // rotate left
  75. Bool ror(C CalcValue &x); // rotate right
  76. Bool equal (C CalcValue &x); // ==
  77. Bool notEqual (C CalcValue &x); // !=
  78. Bool equalGreater(C CalcValue &x); // >=
  79. Bool equalSmaller(C CalcValue &x); // <=
  80. Bool greater(C CalcValue &x); // >
  81. Bool smaller(C CalcValue &x); // <
  82. Bool andLogical(C CalcValue &x); // &&
  83. Bool orLogical(C CalcValue &x); // ||
  84. Bool xorLogical(C CalcValue &x); // ^^
  85. Bool trunc(); // truncate
  86. Bool round(); // round
  87. Bool floor(); // floor
  88. Bool ceil (); // ceil
  89. Bool frac (); // fraction
  90. Bool alignTrunc(C CalcValue &x); // align to 'x' with truncation
  91. Bool alignRound(C CalcValue &x); // align to 'x' with rounding
  92. Bool alignFloor(C CalcValue &x); // align to 'x' with floor
  93. Bool alignCeil (C CalcValue &x); // align to 'x' with ceil
  94. Bool sin(); // sine
  95. Bool cos(); // cosine
  96. Bool tan(); // tangent
  97. Bool ctg(); // cotangent
  98. Bool acos(); // arc cosine
  99. Bool asin(); // arc sine
  100. Bool atan(); // arc tangent
  101. Bool degToRad(); // convert angle degrees to radians
  102. Bool radToDeg(); // convert angle radians to degrees
  103. Bool length ( ); // length
  104. Bool length2( ); // squared length
  105. Bool dot (C CalcValue &x); // dot product
  106. Bool cross (C CalcValue &x); // cross product
  107. Bool perp ( ); // perpendicular
  108. #endif
  109. CalcValue() {} // needed because of union
  110. };
  111. /******************************************************************************/
  112. struct CalcVar // Calculator Variable
  113. {
  114. Str name ;
  115. CalcValue value;
  116. CalcVar& set(C Str &name, CVAL_TYPE type=CVAL_REAL) {T.name=name; T.value.type=type; return T;}
  117. CalcVar( ) {value.type=CVAL_REAL;}
  118. explicit CalcVar(C Str &name, CVAL_TYPE type=CVAL_REAL) {set(name, type);}
  119. };
  120. /******************************************************************************/
  121. extern Char CalcError[]; // contains error on failed Calc()
  122. /******************************************************************************/
  123. // Calculate 'expression', with 'var' array of 'vars' variables
  124. Bool Calculate (CalcValue &value, C Str &expression, C MemPtr<CalcVar> &vars=null); // put result value to 'value' and return if ok
  125. Int CalculateI ( C Str &expression, C MemPtr<CalcVar> &vars=null); // return result value as Int
  126. Long CalculateL ( C Str &expression, C MemPtr<CalcVar> &vars=null); // return result value as Long
  127. Flt CalculateF ( C Str &expression, C MemPtr<CalcVar> &vars=null); // return result value as Flt
  128. Dbl CalculateD ( C Str &expression, C MemPtr<CalcVar> &vars=null); // return result value as Dbl
  129. VecD2 CalculateV2( C Str &expression, C MemPtr<CalcVar> &vars=null); // return result value as Vec2
  130. VecD CalculateV ( C Str &expression, C MemPtr<CalcVar> &vars=null); // return result value as Vec
  131. VecD4 CalculateV4( C Str &expression, C MemPtr<CalcVar> &vars=null); // return result value as Vec4
  132. /******************************************************************************/