]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/SGExpression.cxx
Make subsystem group destruction explicit, so get_subsystem calls during destruction...
[simgear.git] / simgear / structure / SGExpression.cxx
index 162414876eb39d5a7b6229bcd7ee5bb65cfc08e9..a6776636a0eba906dc6b070ea4251d1c0e9f012a 100644 (file)
@@ -33,6 +33,7 @@
 #include <string>
 #include <sstream>
 #include <boost/bind.hpp>
+#include <cstring> // for strcmp
 
 #include <simgear/props/props.hxx>
 
@@ -332,6 +333,38 @@ SGReadIExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
         return output;
     }
 
+    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; (i<expression->nChildren()) && !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<SGExpression<T> > inputExpression;
+        inputExpression = SGReadIExpression<T>(inputRoot, inputNode);
+        if (!inputExpression) {
+            SG_LOG(SG_IO, SG_ALERT, "Cannot read \"" << name << "\" expression.");
+            return 0;
+        }
+        
+        return new SGInterpTableExpression<T>(inputExpression, tab);
+    }
+    
     return 0;
 }
 
@@ -585,9 +618,7 @@ SGReadFExpression(SGPropertyNode *inputRoot, const SGPropertyNode *expression)
         }
         return new SGTanhExpression<T>(inputExpression);
     }
-
-// if (name == "table") {
-// }
+    
 // if (name == "step") {
 // }
 // if (name == "condition") {
@@ -824,7 +855,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;
@@ -840,7 +871,7 @@ int 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();
@@ -855,7 +886,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;