X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2FSGExpression.cxx;h=6f292e46faa8ed596044ac30a77560104b4491b9;hb=5af8bb7c8e259f5bdda67beb87adcc453e0b32e7;hp=d534aad07274fa698a28e4d4c6f248c905a19ab7;hpb=9e77d06c7262eafdf77b03d2b101e090cb2ec91d;p=simgear.git diff --git a/simgear/structure/SGExpression.cxx b/simgear/structure/SGExpression.cxx index d534aad0..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."); @@ -355,7 +372,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) } SGSharedPtr > inputExpression; - inputExpression = SGReadIExpression(inputRoot, inputNode); + inputExpression = SGReadExpression(inputRoot, inputNode); if (!inputExpression) { SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression."); return 0; @@ -364,29 +381,13 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression) return new SGInterpTableExpression(inputExpression, tab); } - 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 == "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; @@ -400,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; @@ -414,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; @@ -428,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; @@ -442,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; @@ -456,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; @@ -470,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; @@ -484,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; @@ -498,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; @@ -512,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; @@ -526,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; @@ -540,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; @@ -554,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; @@ -568,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; @@ -582,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; @@ -596,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; @@ -610,7 +611,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; @@ -629,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."); @@ -644,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."); @@ -659,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."); @@ -674,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."); @@ -690,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, @@ -854,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; @@ -870,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(); @@ -885,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;