ModuleMath.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #include "ModuleMath.h"
  2. namespace mdd {
  3. ModuleMath::ModuleMath(MathOperation operation) {
  4. _operation = operation;
  5. json default_val;
  6. default_val["value"] = 1;
  7. auto veri = [](const json& val){
  8. if(val.find("value")==val.end())
  9. return false;
  10. return true;};
  11. addInput("Value", default_val, veri);
  12. addInput("Value", default_val, veri);
  13. addOutput("Value", default_val);
  14. }
  15. json ModuleMath::add(const json &val1, const json &val2) {
  16. json ret = json::array();
  17. if (val1.is_array()) {
  18. for (int i = 0; i < val1.size(); i++) {
  19. if (val2.is_array()) {
  20. if (val1.size() == val2.size()) {
  21. ret.push_back(add(val1[i],val2[i]));
  22. }
  23. } else {
  24. ret.push_back(add(val1[i],val2));
  25. }
  26. }
  27. } else {
  28. if (val2.is_array()) {
  29. for (int i = 0; i < val2.size(); i++) {
  30. ret.push_back(add(val1,val2[i]));
  31. }
  32. } else {
  33. if (val1.is_number() && val2.is_number()) {
  34. if (val1.is_number_float()) {
  35. if (val2.is_number_float()) {
  36. ret = val1.get<float>() + val2.get<float>();
  37. } else {
  38. ret = val1.get<float>() + val2.get<int>();
  39. }
  40. } else {
  41. if (val2.is_number_float()) {
  42. ret = val1.get<int>() + val2.get<float>();
  43. } else {
  44. ret = val1.get<int>() + val2.get<int>();
  45. }
  46. }
  47. } else {
  48. }
  49. }
  50. }
  51. return ret;
  52. }
  53. json ModuleMath::subtract(const json &val1, const json &val2){
  54. json ret = json::array();
  55. if (val1.is_array()) {
  56. for (int i = 0; i < val1.size(); i++) {
  57. if (val2.is_array()) {
  58. if (val1.size() == val2.size()) {
  59. ret.push_back(subtract(val1[i],val2[i]));
  60. }
  61. } else {
  62. ret.push_back(subtract(val1[i],val2));
  63. }
  64. }
  65. } else {
  66. if (val2.is_array()) {
  67. for (int i = 0; i < val2.size(); i++) {
  68. ret.push_back(subtract(val1,val2[i]));
  69. }
  70. } else {
  71. if (val1.is_number() && val2.is_number()) {
  72. if (val1.is_number_float()) {
  73. if (val2.is_number_float()) {
  74. ret = val1.get<float>() - val2.get<float>();
  75. } else {
  76. ret = val1.get<float>() - val2.get<int>();
  77. }
  78. } else {
  79. if (val2.is_number_float()) {
  80. ret = val1.get<int>() - val2.get<float>();
  81. } else {
  82. ret = val1.get<int>() - val2.get<int>();
  83. }
  84. }
  85. } else {
  86. }
  87. }
  88. }
  89. return ret;
  90. }
  91. json ModuleMath::multiply(const json &val1, const json &val2){
  92. json ret = json::array();
  93. if (val1.is_array()) {
  94. for (int i = 0; i < val1.size(); i++) {
  95. if (val2.is_array()) {
  96. if (val1.size() == val2.size()) {
  97. ret.push_back(multiply(val1[i],val2[i]));
  98. }
  99. } else {
  100. ret.push_back(multiply(val1[i],val2));
  101. }
  102. }
  103. } else {
  104. if (val2.is_array()) {
  105. for (int i = 0; i < val2.size(); i++) {
  106. ret.push_back(multiply(val1,val2[i]));
  107. }
  108. } else {
  109. if (val1.is_number() && val2.is_number()) {
  110. if (val1.is_number_float()) {
  111. if (val2.is_number_float()) {
  112. ret = val1.get<float>() * val2.get<float>();
  113. } else {
  114. ret = val1.get<float>() * val2.get<int>();
  115. }
  116. } else {
  117. if (val2.is_number_float()) {
  118. ret = val1.get<int>() * val2.get<float>();
  119. } else {
  120. ret = val1.get<int>() * val2.get<int>();
  121. }
  122. }
  123. } else {
  124. }
  125. }
  126. }
  127. return ret;
  128. }
  129. json ModuleMath::divide(const json &val1, const json &val2){
  130. json ret = json::array();
  131. if (val1.is_array()) {
  132. for (int i = 0; i < val1.size(); i++) {
  133. if (val2.is_array()) {
  134. if (val1.size() == val2.size()) {
  135. ret.push_back(divide(val1[i],val2[i]));
  136. }
  137. } else {
  138. ret.push_back(divide(val1[i],val2));
  139. }
  140. }
  141. } else {
  142. if (val2.is_array()) {
  143. for (int i = 0; i < val2.size(); i++) {
  144. ret.push_back(divide(val1,val2[i]));
  145. }
  146. } else {
  147. if (val1.is_number() && val2.is_number()) {
  148. if (val1.is_number_float()) {
  149. if (val2.is_number_float()) {
  150. ret = val1.get<float>() / val2.get<float>();
  151. } else {
  152. ret = val1.get<float>() / val2.get<int>();
  153. }
  154. } else {
  155. if (val2.is_number_float()) {
  156. ret = val1.get<int>() / val2.get<float>();
  157. } else {
  158. ret = val1.get<int>()*1.0 / val2.get<int>();
  159. }
  160. }
  161. } else {
  162. }
  163. }
  164. }
  165. return ret;
  166. }
  167. void ModuleMath::update() {
  168. json ret = getOutput(0)->getValue()["value"];
  169. switch (_operation) {
  170. case ADD:
  171. ret = add(getInputValue(0)["value"], getInputValue(1)["value"]);
  172. break;
  173. case SUBTRACT:
  174. ret = subtract(getInputValue(0)["value"], getInputValue(1)["value"]);
  175. break;
  176. case MULTIPLY:
  177. ret = multiply(getInputValue(0)["value"], getInputValue(1)["value"]);
  178. break;
  179. case DIVIDE:
  180. ret = divide(getInputValue(0)["value"], getInputValue(1)["value"]);
  181. break;
  182. }
  183. if (ret.dump() != getOutput(0)->getValue()["value"].dump()) {
  184. setOutputValue(0)["value"] = ret ;
  185. }
  186. }
  187. void ModuleMath::setMathOperation(MathOperation operation){
  188. _operation = operation;
  189. }
  190. MathOperation ModuleMath::getMathOperation(){
  191. return _operation;
  192. }
  193. /*
  194. * Document:
  195. * var:
  196. * value0, value1, value2, ...
  197. * var1:
  198. * args:
  199. * etc.
  200. *
  201. */
  202. }
  203. //gdb
  204. //catch throw
  205. //run