X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2FSGExpression.cxx;h=6f292e46faa8ed596044ac30a77560104b4491b9;hb=66c9187c95fb6861d9737f135fdf68d1bfa265f3;hp=162414876eb39d5a7b6229bcd7ee5bb65cfc08e9;hpb=9cbbe5559844317f44744788ddb308101a1e75e9;p=simgear.git diff --git a/simgear/structure/SGExpression.cxx b/simgear/structure/SGExpression.cxx index 16241487..6f292e46 100644 --- a/simgear/structure/SGExpression.cxx +++ b/simgear/structure/SGExpression.cxx @@ -33,6 +33,7 @@ #include #include #include +#include // for strcmp #include @@ -126,7 +127,7 @@ SGReadValueFromContent(const SGPropertyNode *node, T& value) template static SGExpression* -SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression); +SGReadExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression); template static bool @@ -135,7 +136,7 @@ SGReadNaryOperands(SGNaryExpression* nary, { for (int i = 0; i < expression->nChildren(); ++i) { SGExpression* inputExpression; - inputExpression = SGReadIExpression(inputRoot, expression->getChild(i)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(i)); if (!inputExpression) return false; nary->addOperand(inputExpression); @@ -165,12 +166,13 @@ SGReadNaryOperands(SGNaryExpression* nary, template static SGExpression* -SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) +SGReadExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) { if (!expression) return 0; std::string name = expression->getName(); + if (name == "value") { T value; if (!SGReadValueFromContent(expression, value)) { @@ -201,7 +203,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadIExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -215,7 +217,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadIExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -240,7 +242,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) SGSharedPtr > inputExpression; for (int i = 0; !inputExpression && i < expression->nChildren(); ++i) - inputExpression = SGReadIExpression(inputRoot, expression->getChild(i)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(i)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -254,8 +256,8 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadIExpression(inputRoot, expression->getChild(0)), - SGReadIExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -269,8 +271,8 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadIExpression(inputRoot, expression->getChild(0)), - SGReadIExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -292,6 +294,21 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) } return output; } + + if (name == "difference" || name == "dif" ) { + if (expression->nChildren() < 1) { + SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); + return 0; + } + SGDifferenceExpression* output = new SGDifferenceExpression; + if (!SGReadNaryOperands(output, inputRoot, expression)) { + delete output; + SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); + return 0; + } + return output; + } + if (name == "prod" || name == "product") { if (expression->nChildren() < 1) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -332,29 +349,45 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return output; } - return 0; -} - - -template -static SGExpression* -SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) -{ - SGExpression* r = SGReadIExpression(inputRoot, expression); - if (r) - return r; - - if (!expression) - return 0; - - std::string name = expression->getName(); + if (name == "table") { + SGInterpTable* tab = new SGInterpTable(expression); + if (!tab) { + SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression: malformed table"); + return 0; + } + + // find input expression - i.e a child not named 'entry' + const SGPropertyNode* inputNode = NULL; + for (int i=0; (inChildren()) && !inputNode; ++i) { + if (strcmp(expression->getChild(i)->getName(), "entry") == 0) { + continue; + } + + inputNode = expression->getChild(i); + } + + if (!inputNode) { + SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression: no input found"); + return 0; + } + + SGSharedPtr > inputExpression; + inputExpression = SGReadExpression(inputRoot, inputNode); + if (!inputExpression) { + SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); + return 0; + } + + return new SGInterpTableExpression(inputExpression, tab); + } + if (name == "acos") { if (expression->nChildren() != 1) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -368,7 +401,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -382,7 +415,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -396,7 +429,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -410,7 +443,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -424,7 +457,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -438,7 +471,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -452,7 +485,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -466,7 +499,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -480,7 +513,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -494,7 +527,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -508,7 +541,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -522,7 +555,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -536,7 +569,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -550,7 +583,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -564,7 +597,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -578,16 +611,14 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpression; - inputExpression = SGReadFExpression(inputRoot, expression->getChild(0)); + inputExpression = SGReadExpression(inputRoot, expression->getChild(0)); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; } return new SGTanhExpression(inputExpression); } - -// if (name == "table") { -// } + // if (name == "step") { // } // if (name == "condition") { @@ -599,8 +630,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadFExpression(inputRoot, expression->getChild(0)), - SGReadFExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -614,8 +645,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadFExpression(inputRoot, expression->getChild(0)), - SGReadFExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -629,8 +660,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadFExpression(inputRoot, expression->getChild(0)), - SGReadFExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -644,8 +675,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return 0; } SGSharedPtr > inputExpressions[2] = { - SGReadIExpression(inputRoot, expression->getChild(0)), - SGReadIExpression(inputRoot, expression->getChild(1)) + SGReadExpression(inputRoot, expression->getChild(0)), + SGReadExpression(inputRoot, expression->getChild(1)) }; if (!inputExpressions[0] || !inputExpressions[1]) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); @@ -660,17 +691,17 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) SGExpression* SGReadIntExpression(SGPropertyNode *inputRoot, const SGPropertyNode *configNode) -{ return SGReadIExpression(inputRoot, configNode); } +{ return SGReadExpression(inputRoot, configNode); } SGExpression* SGReadFloatExpression(SGPropertyNode *inputRoot, const SGPropertyNode *configNode) -{ return SGReadFExpression(inputRoot, configNode); } +{ return SGReadExpression(inputRoot, configNode); } SGExpression* SGReadDoubleExpression(SGPropertyNode *inputRoot, const SGPropertyNode *configNode) -{ return SGReadFExpression(inputRoot, configNode); } +{ return SGReadExpression(inputRoot, configNode); } // SGExpression* // SGReadBoolExpression(SGPropertyNode *inputRoot, @@ -824,7 +855,7 @@ Expression* logicopParser(const SGPropertyNode* exp, Parser* parser) parser->readChildren(exp, children); vector::iterator notBool = find_if(children.begin(), children.end(), - bind(&Expression::getType, _1) != BOOL); + boost::bind(&Expression::getType, _1) != BOOL); if (notBool != children.end()) throw("non boolean operand to logical expression"); Logicop *expr = new Logicop; @@ -840,7 +871,7 @@ int BindingLayout::addBinding(const string& name, Type type) //XXX error checkint vector::iterator itr = find_if(bindings.begin(), bindings.end(), - bind(&VariableBinding::name, _1) == name); + boost::bind(&VariableBinding::name, _1) == name); if (itr != bindings.end()) return itr->location; int result = bindings.size(); @@ -855,7 +886,7 @@ bool BindingLayout::findBinding(const std::string& name, using namespace boost; vector::const_iterator itr = find_if(bindings.begin(), bindings.end(), - bind(&VariableBinding::name, _1) == name); + boost::bind(&VariableBinding::name, _1) == name); if (itr != bindings.end()) { result = *itr; return true;