]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/SGExpression.cxx
math: Move lerp function into SGMisc.
[simgear.git] / simgear / structure / SGExpression.cxx
index a6776636a0eba906dc6b070ea4251d1c0e9f012a..6f292e46faa8ed596044ac30a77560104b4491b9 100644 (file)
@@ -127,7 +127,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
@@ -136,7 +136,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);
@@ -166,12 +166,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)) {
@@ -202,7 +203,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;
@@ -216,7 +217,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;
@@ -241,7 +242,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;
@@ -255,8 +256,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.");
@@ -270,8 +271,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.");
@@ -293,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<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.");
@@ -356,7 +372,7 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
         }
         
         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;
@@ -365,29 +381,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;
@@ -401,7 +401,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;
@@ -415,7 +415,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;
@@ -429,7 +429,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;
@@ -443,7 +443,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;
@@ -457,7 +457,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;
@@ -471,7 +471,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;
@@ -485,7 +485,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;
@@ -499,7 +499,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;
@@ -513,7 +513,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;
@@ -527,7 +527,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;
@@ -541,7 +541,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;
@@ -555,7 +555,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;
@@ -569,7 +569,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;
@@ -583,7 +583,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;
@@ -597,7 +597,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;
@@ -611,7 +611,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;
@@ -630,8 +630,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.");
@@ -645,8 +645,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.");
@@ -660,8 +660,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.");
@@ -675,8 +675,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.");
@@ -691,17 +691,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,