#include "ModuleMath.h" namespace mdd { ModuleMath::ModuleMath(MathOperation operation) { _operation = operation; json default_val; default_val["value"] = 1; auto veri = [](const json& val){ if(val.find("value")==val.end()) return false; return true;}; addInput("Value", default_val, veri); addInput("Value", default_val, veri); addOutput("Value", default_val); } json ModuleMath::add(const json &val1, const json &val2) { json ret = json::array(); if (val1.is_array()) { for (int i = 0; i < val1.size(); i++) { if (val2.is_array()) { if (val1.size() == val2.size()) { ret.push_back(add(val1[i],val2[i])); } } else { ret.push_back(add(val1[i],val2)); } } } else { if (val2.is_array()) { for (int i = 0; i < val2.size(); i++) { ret.push_back(add(val1,val2[i])); } } else { if (val1.is_number() && val2.is_number()) { if (val1.is_number_float()) { if (val2.is_number_float()) { ret = val1.get() + val2.get(); } else { ret = val1.get() + val2.get(); } } else { if (val2.is_number_float()) { ret = val1.get() + val2.get(); } else { ret = val1.get() + val2.get(); } } } else { } } } return ret; } json ModuleMath::subtract(const json &val1, const json &val2){ json ret = json::array(); if (val1.is_array()) { for (int i = 0; i < val1.size(); i++) { if (val2.is_array()) { if (val1.size() == val2.size()) { ret.push_back(subtract(val1[i],val2[i])); } } else { ret.push_back(subtract(val1[i],val2)); } } } else { if (val2.is_array()) { for (int i = 0; i < val2.size(); i++) { ret.push_back(subtract(val1,val2[i])); } } else { if (val1.is_number() && val2.is_number()) { if (val1.is_number_float()) { if (val2.is_number_float()) { ret = val1.get() - val2.get(); } else { ret = val1.get() - val2.get(); } } else { if (val2.is_number_float()) { ret = val1.get() - val2.get(); } else { ret = val1.get() - val2.get(); } } } else { } } } return ret; } json ModuleMath::multiply(const json &val1, const json &val2){ json ret = json::array(); if (val1.is_array()) { for (int i = 0; i < val1.size(); i++) { if (val2.is_array()) { if (val1.size() == val2.size()) { ret.push_back(multiply(val1[i],val2[i])); } } else { ret.push_back(multiply(val1[i],val2)); } } } else { if (val2.is_array()) { for (int i = 0; i < val2.size(); i++) { ret.push_back(multiply(val1,val2[i])); } } else { if (val1.is_number() && val2.is_number()) { if (val1.is_number_float()) { if (val2.is_number_float()) { ret = val1.get() * val2.get(); } else { ret = val1.get() * val2.get(); } } else { if (val2.is_number_float()) { ret = val1.get() * val2.get(); } else { ret = val1.get() * val2.get(); } } } else { } } } return ret; } json ModuleMath::divide(const json &val1, const json &val2){ json ret = json::array(); if (val1.is_array()) { for (int i = 0; i < val1.size(); i++) { if (val2.is_array()) { if (val1.size() == val2.size()) { ret.push_back(divide(val1[i],val2[i])); } } else { ret.push_back(divide(val1[i],val2)); } } } else { if (val2.is_array()) { for (int i = 0; i < val2.size(); i++) { ret.push_back(divide(val1,val2[i])); } } else { if (val1.is_number() && val2.is_number()) { if (val1.is_number_float()) { if (val2.is_number_float()) { ret = val1.get() / val2.get(); } else { ret = val1.get() / val2.get(); } } else { if (val2.is_number_float()) { ret = val1.get() / val2.get(); } else { ret = val1.get()*1.0 / val2.get(); } } } else { } } } return ret; } void ModuleMath::update() { json ret = getOutput(0)->getValue()["value"]; switch (_operation) { case ADD: ret = add(getInputValue(0)["value"], getInputValue(1)["value"]); break; case SUBTRACT: ret = subtract(getInputValue(0)["value"], getInputValue(1)["value"]); break; case MULTIPLY: ret = multiply(getInputValue(0)["value"], getInputValue(1)["value"]); break; case DIVIDE: ret = divide(getInputValue(0)["value"], getInputValue(1)["value"]); break; } if (ret.dump() != getOutput(0)->getValue()["value"].dump()) { setOutputValue(0)["value"] = ret ; } } void ModuleMath::setMathOperation(MathOperation operation){ _operation = operation; } MathOperation ModuleMath::getMathOperation(){ return _operation; } /* * Document: * var: * value0, value1, value2, ... * var1: * args: * etc. * */ } //gdb //catch throw //run