]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/SGExpression.cxx
Fix use count for deleted, reference counted objects.
[simgear.git] / simgear / structure / SGExpression.cxx
index d534aad07274fa698a28e4d4c6f248c905a19ab7..2633e311fdd7a646688e021d1ed7d53fb20fdc3d 100644 (file)
 #include "Singleton.hxx"
 
 #include <algorithm>
-#include <functional>
 #include <map>
 #include <utility>
 #include <string>
 #include <sstream>
 #include <boost/bind.hpp>
+#include <cstring> // for strcmp
 
 #include <simgear/props/props.hxx>
 
@@ -126,7 +126,7 @@ SGReadValueFromContent(const SGPropertyNode *node, T& value)
 
 template<typename T>
 static SGExpression<T>*
-SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression);
+SGReadExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression);
 
 template<typename T>
 static bool
@@ -135,7 +135,7 @@ SGReadNaryOperands(SGNaryExpression<T>* nary,
 {
     for (int i = 0; i < expression->nChildren(); ++i) {
         SGExpression<T>* inputExpression;
-        inputExpression = SGReadIExpression<T>(inputRoot, expression->getChild(i));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(i));
         if (!inputExpression)
             return false;
         nary->addOperand(inputExpression);
@@ -165,12 +165,13 @@ SGReadNaryOperands(SGNaryExpression<T>* nary,
 
 template<typename T>
 static SGExpression<T>*
-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 +202,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadIExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -215,7 +216,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadIExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -240,7 +241,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
 
         SGSharedPtr<SGExpression<T> > inputExpression;
         for (int i = 0; !inputExpression && i < expression->nChildren(); ++i)
-            inputExpression = SGReadIExpression<T>(inputRoot, expression->getChild(i));
+            inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(i));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -254,8 +255,8 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpressions[2] = {
-            SGReadIExpression<T>(inputRoot, expression->getChild(0)),
-            SGReadIExpression<T>(inputRoot, expression->getChild(1))
+            SGReadExpression<T>(inputRoot, expression->getChild(0)),
+            SGReadExpression<T>(inputRoot, expression->getChild(1))
         };
         if (!inputExpressions[0] || !inputExpressions[1]) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
@@ -269,8 +270,8 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpressions[2] = {
-            SGReadIExpression<T>(inputRoot, expression->getChild(0)),
-            SGReadIExpression<T>(inputRoot, expression->getChild(1))
+            SGReadExpression<T>(inputRoot, expression->getChild(0)),
+            SGReadExpression<T>(inputRoot, expression->getChild(1))
         };
         if (!inputExpressions[0] || !inputExpressions[1]) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
@@ -292,6 +293,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<T>* output = new SGDifferenceExpression<T>;
+        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.");
@@ -353,9 +369,9 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression: no input found");
             return 0;
         }
-        
+
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadIExpression<T>(inputRoot, inputNode);
+        inputExpression = SGReadExpression<T>(inputRoot, inputNode);
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -364,29 +380,13 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
         return new SGInterpTableExpression<T>(inputExpression, tab);
     }
     
-    return 0;
-}
-
-
-template<typename T>
-static SGExpression<T>*
-SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
-{
-    SGExpression<T>* r = SGReadIExpression<T>(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<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -400,7 +400,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -414,7 +414,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -428,7 +428,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -442,7 +442,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -456,7 +456,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -470,7 +470,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -484,7 +484,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -498,7 +498,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -512,7 +512,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -526,7 +526,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -540,7 +540,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -554,7 +554,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -568,7 +568,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -582,7 +582,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -596,7 +596,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -610,7 +610,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpression;
-        inputExpression = SGReadFExpression<T>(inputRoot, expression->getChild(0));
+        inputExpression = SGReadExpression<T>(inputRoot, expression->getChild(0));
         if (!inputExpression) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
             return 0;
@@ -629,8 +629,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpressions[2] = {
-            SGReadFExpression<T>(inputRoot, expression->getChild(0)),
-            SGReadFExpression<T>(inputRoot, expression->getChild(1))
+            SGReadExpression<T>(inputRoot, expression->getChild(0)),
+            SGReadExpression<T>(inputRoot, expression->getChild(1))
         };
         if (!inputExpressions[0] || !inputExpressions[1]) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
@@ -644,8 +644,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpressions[2] = {
-            SGReadFExpression<T>(inputRoot, expression->getChild(0)),
-            SGReadFExpression<T>(inputRoot, expression->getChild(1))
+            SGReadExpression<T>(inputRoot, expression->getChild(0)),
+            SGReadExpression<T>(inputRoot, expression->getChild(1))
         };
         if (!inputExpressions[0] || !inputExpressions[1]) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
@@ -659,8 +659,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpressions[2] = {
-            SGReadFExpression<T>(inputRoot, expression->getChild(0)),
-            SGReadFExpression<T>(inputRoot, expression->getChild(1))
+            SGReadExpression<T>(inputRoot, expression->getChild(0)),
+            SGReadExpression<T>(inputRoot, expression->getChild(1))
         };
         if (!inputExpressions[0] || !inputExpressions[1]) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
@@ -674,8 +674,8 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
             return 0;
         }
         SGSharedPtr<SGExpression<T> > inputExpressions[2] = {
-            SGReadIExpression<T>(inputRoot, expression->getChild(0)),
-            SGReadIExpression<T>(inputRoot, expression->getChild(1))
+            SGReadExpression<T>(inputRoot, expression->getChild(0)),
+            SGReadExpression<T>(inputRoot, expression->getChild(1))
         };
         if (!inputExpressions[0] || !inputExpressions[1]) {
             SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
@@ -690,17 +690,17 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
 SGExpression<int>*
 SGReadIntExpression(SGPropertyNode *inputRoot,
                     const SGPropertyNode *configNode)
-{ return SGReadIExpression<int>(inputRoot, configNode); }
+{ return SGReadExpression<int>(inputRoot, configNode); }
 
 SGExpression<float>*
 SGReadFloatExpression(SGPropertyNode *inputRoot,
                       const SGPropertyNode *configNode)
-{ return SGReadFExpression<float>(inputRoot, configNode); }
+{ return SGReadExpression<float>(inputRoot, configNode); }
 
 SGExpression<double>*
 SGReadDoubleExpression(SGPropertyNode *inputRoot,
                        const SGPropertyNode *configNode)
-{ return SGReadFExpression<double>(inputRoot, configNode); }
+{ return SGReadExpression<double>(inputRoot, configNode); }
 
 // SGExpression<bool>*
 // SGReadBoolExpression(SGPropertyNode *inputRoot,
@@ -854,7 +854,7 @@ Expression* logicopParser(const SGPropertyNode* exp, Parser* parser)
     parser->readChildren(exp, children);
     vector<Expression*>::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;
@@ -865,15 +865,15 @@ Expression* logicopParser(const SGPropertyNode* exp, Parser* parser)
 ExpParserRegistrar andRegistrar("and", logicopParser<AndExpression>);
 ExpParserRegistrar orRegistrar("or", logicopParser<OrExpression>);
 
-int BindingLayout::addBinding(const string& name, Type type)
+size_t BindingLayout::addBinding(const string& name, Type type)
 {
     //XXX error checkint
     vector<VariableBinding>::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();
+    size_t result = bindings.size();
     bindings.push_back(VariableBinding(name, type, bindings.size()));
     return result;
 }
@@ -885,7 +885,7 @@ bool BindingLayout::findBinding(const std::string& name,
     using namespace boost;
     vector<VariableBinding>::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;