/src/tools/interpreter/builtins/liberty_interpreter_external_type_reals_builtins.e

http://github.com/tybor/Liberty · Specman e · 150 lines · 120 code · 16 blank · 14 comment · 0 complexity · ac724feca12503bb55428b57fd682a55 MD5 · raw file

  1. -- This file is part of Liberty Eiffel.
  2. --
  3. -- Liberty Eiffel is free software: you can redistribute it and/or modify
  4. -- it under the terms of the GNU General Public License as published by
  5. -- the Free Software Foundation, version 3 of the License.
  6. --
  7. -- Liberty Eiffel is distributed in the hope that it will be useful,
  8. -- but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. -- GNU General Public License for more details.
  11. --
  12. -- You should have received a copy of the GNU General Public License
  13. -- along with Liberty Eiffel. If not, see <http://www.gnu.org/licenses/>.
  14. --
  15. deferred class LIBERTY_INTERPRETER_EXTERNAL_TYPE_REALS_BUILTINS[E_ -> FLOAT]
  16. inherit
  17. LIBERTY_INTERPRETER_EXTERNAL_TYPED_BUILTINS[E_]
  18. undefine
  19. target, left, right
  20. redefine
  21. call_add, call_subtract, call_times, call_divide, call_power,
  22. call_less_or_equal, call_less_than, call_greater_or_equal, call_greater_than,
  23. call_negative,
  24. call_other
  25. end
  26. feature {}
  27. new_real (value: E_): LIBERTY_INTERPRETER_OBJECT_NATIVE[REAL_128] is
  28. deferred
  29. end
  30. right_as_integer: INTEGER is
  31. local
  32. obj: LIBERTY_INTERPRETER_OBJECT_NATIVE[INTEGER_64]
  33. do
  34. builtin_call.evaluate_parameters
  35. obj ::= builtin_call.parameters.first
  36. Result := obj.item.to_integer_32
  37. end
  38. call_specific (f: LIBERTY_FEATURE) is
  39. deferred
  40. end
  41. feature {LIBERTY_FEATURE_LOCAL_CONTEXT}
  42. call_add (f: LIBERTY_FEATURE) is
  43. do
  44. returned := new_real(left + right)
  45. end
  46. call_subtract (f: LIBERTY_FEATURE) is
  47. do
  48. returned := new_real(left - right)
  49. end
  50. call_times (f: LIBERTY_FEATURE) is
  51. do
  52. returned := new_real(left * right)
  53. end
  54. call_divide (f: LIBERTY_FEATURE) is
  55. do
  56. returned := new_real(left / right)
  57. end
  58. call_less_or_equal (f: LIBERTY_FEATURE) is
  59. do
  60. returned := interpreter.new_boolean(left <= right, builtin_call.position)
  61. end
  62. call_less_than (f: LIBERTY_FEATURE) is
  63. do
  64. returned := interpreter.new_boolean(left < right, builtin_call.position)
  65. end
  66. call_greater_or_equal (f: LIBERTY_FEATURE) is
  67. do
  68. returned := interpreter.new_boolean(left >= right, builtin_call.position)
  69. end
  70. call_greater_than (f: LIBERTY_FEATURE) is
  71. do
  72. returned := interpreter.new_boolean(left > right, builtin_call.position)
  73. end
  74. call_negative (f: LIBERTY_FEATURE) is
  75. do
  76. returned := new_real(-target)
  77. end
  78. call_power (f: LIBERTY_FEATURE) is
  79. do
  80. returned := new_real(left ^ right_as_integer)
  81. end
  82. call_other (f: LIBERTY_FEATURE) is
  83. do
  84. inspect
  85. builtin_call.name
  86. when "is_not_a_number" then
  87. returned := interpreter.new_boolean(target.is_not_a_number, builtin_call.position)
  88. when "is_infinity" then
  89. returned := interpreter.new_boolean(target.is_infinity, builtin_call.position)
  90. when "is_subnormal" then
  91. returned := interpreter.new_boolean(target.is_subnormal, builtin_call.position)
  92. when "is_normal" then
  93. returned := interpreter.new_boolean(target.is_normal, builtin_call.position)
  94. when "rounded" then
  95. returned := new_real(target.rounded)
  96. when "floor" then
  97. returned := new_real(target.floor)
  98. when "ceiling" then
  99. returned := new_real(target.ceiling)
  100. when "sqrt" then
  101. returned := new_real(target.sqrt)
  102. when "sin" then
  103. returned := new_real(target.sin)
  104. when "cos" then
  105. returned := new_real(target.cos)
  106. when "tan" then
  107. returned := new_real(target.tan)
  108. when "asin" then
  109. returned := new_real(target.asin)
  110. when "acos" then
  111. returned := new_real(target.acos)
  112. when "atan" then
  113. returned := new_real(target.atan)
  114. when "atan2" then
  115. returned := new_real(target.atan2(right))
  116. when "sinh" then
  117. returned := new_real(target.sinh)
  118. when "cosh" then
  119. returned := new_real(target.cosh)
  120. when "tanh" then
  121. returned := new_real(target.tanh)
  122. when "exp" then
  123. returned := new_real(target.exp)
  124. when "log" then
  125. returned := new_real(target.log)
  126. when "log10" then
  127. returned := new_real(target.log10)
  128. when "pow" then
  129. returned := new_real(target.pow(right))
  130. else
  131. call_specific(f)
  132. end
  133. end
  134. end -- class LIBERTY_INTERPRETER_EXTERNAL_TYPE_REALS_BUILTINS