operators.hpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. // This file is distributed under the BSD License.
  2. // See "license.txt" for details.
  3. // Copyright 2009-2012, Jonathan Turner ([email protected])
  4. // Copyright 2009-2017, Jason Turner ([email protected])
  5. // http://www.chaiscript.com
  6. // This is an open source non-commercial project. Dear PVS-Studio, please check it.
  7. // PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
  8. #ifndef CHAISCRIPT_OPERATORS_HPP_
  9. #define CHAISCRIPT_OPERATORS_HPP_
  10. #include "../chaiscript_defines.hpp"
  11. #include "register_function.hpp"
  12. namespace chaiscript
  13. {
  14. namespace bootstrap
  15. {
  16. namespace operators
  17. {
  18. template<typename T>
  19. void assign(Module& m)
  20. {
  21. m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs = rhs;}), "=");
  22. }
  23. template<typename T>
  24. void assign_bitwise_and(Module& m)
  25. {
  26. m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs &= rhs;}), "&=");
  27. }
  28. template<typename T>
  29. void assign_xor(Module& m)
  30. {
  31. m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs ^= rhs;}), "^=");
  32. }
  33. template<typename T>
  34. void assign_bitwise_or(Module& m)
  35. {
  36. m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs |= rhs;}), "|=");
  37. }
  38. template<typename T>
  39. void assign_difference(Module& m)
  40. {
  41. m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs -= rhs;}), "-=");
  42. }
  43. template<typename T>
  44. void assign_left_shift(Module& m)
  45. {
  46. m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs <<= rhs;}), "<<=");
  47. }
  48. template<typename T>
  49. void assign_product(Module& m)
  50. {
  51. m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs <<= rhs;}), "*=");
  52. }
  53. template<typename T>
  54. void assign_quotient(Module& m)
  55. {
  56. m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs /= rhs;}), "/=");
  57. }
  58. template<typename T>
  59. void assign_remainder(Module& m)
  60. {
  61. m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs %= rhs;}), "%=");
  62. }
  63. template<typename T>
  64. void assign_right_shift(Module& m)
  65. {
  66. m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs >>= rhs;}), ">>=");
  67. }
  68. template<typename T>
  69. void assign_sum(Module& m)
  70. {
  71. m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs += rhs;}), "+=");
  72. }
  73. template<typename T>
  74. void prefix_decrement(Module& m)
  75. {
  76. m.add(chaiscript::fun([](T &lhs)->T&{return --lhs;}), "--");
  77. }
  78. template<typename T>
  79. void prefix_increment(Module& m)
  80. {
  81. m.add(chaiscript::fun([](T &lhs)->T&{return ++lhs;}), "++");
  82. }
  83. template<typename T>
  84. void equal(Module& m)
  85. {
  86. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs==rhs;}), "==");
  87. }
  88. template<typename T>
  89. void greater_than(Module& m)
  90. {
  91. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs>rhs;}), ">");
  92. }
  93. template<typename T>
  94. void greater_than_equal(Module& m)
  95. {
  96. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs>=rhs;}), ">=");
  97. }
  98. template<typename T>
  99. void less_than(Module& m)
  100. {
  101. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs<rhs;}), "<");
  102. }
  103. template<typename T>
  104. void less_than_equal(Module& m)
  105. {
  106. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs<=rhs;}), "<=");
  107. }
  108. template<typename T>
  109. void logical_compliment(Module& m)
  110. {
  111. m.add(chaiscript::fun([](const T &lhs){return !lhs;}), "!");
  112. }
  113. template<typename T>
  114. void not_equal(Module& m)
  115. {
  116. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs!=rhs;}), "!=");
  117. }
  118. template<typename T>
  119. void addition(Module& m)
  120. {
  121. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs+rhs;}), "+");
  122. }
  123. template<typename T>
  124. void unary_plus(Module& m)
  125. {
  126. m.add(chaiscript::fun([](const T &lhs){return +lhs;}), "+");
  127. }
  128. template<typename T>
  129. void subtraction(Module& m)
  130. {
  131. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs-rhs;}), "-");
  132. }
  133. template<typename T>
  134. void unary_minus(Module& m)
  135. {
  136. m.add(chaiscript::fun([](const T &lhs){return -lhs;}), "-");
  137. }
  138. template<typename T>
  139. void bitwise_and(Module& m)
  140. {
  141. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs&rhs;}), "&");
  142. }
  143. template<typename T>
  144. void bitwise_compliment(Module& m)
  145. {
  146. m.add(chaiscript::fun([](const T &lhs){return ~lhs;}), "~");
  147. }
  148. template<typename T>
  149. void bitwise_xor(Module& m)
  150. {
  151. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs^rhs;}), "^");
  152. }
  153. template<typename T>
  154. void bitwise_or(Module& m)
  155. {
  156. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs|rhs;}), "|");
  157. }
  158. template<typename T>
  159. void division(Module& m)
  160. {
  161. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs/rhs;}), "/");
  162. }
  163. template<typename T>
  164. void left_shift(Module& m)
  165. {
  166. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs<<rhs;}), "<<");
  167. }
  168. template<typename T>
  169. void multiplication(Module& m)
  170. {
  171. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs*rhs;}), "*");
  172. }
  173. template<typename T>
  174. void remainder(Module& m)
  175. {
  176. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs%rhs;}), "%");
  177. }
  178. template<typename T>
  179. void right_shift(Module& m)
  180. {
  181. m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs>>rhs;}), ">>");
  182. }
  183. }
  184. }
  185. }
  186. #endif