]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/SGExpression.cxx
Use SGAtomic's compareAndExchange instead of a new SGSwappable class
[simgear.git] / simgear / structure / SGExpression.cxx
index 4c746d885d74a34e5314058ab1706c86c71b7004..fa6650300fce9a0bf55f395b91b805ae4f6eb01b 100644 (file)
@@ -682,44 +682,6 @@ namespace simgear
 namespace expression
 {
 
-class Parser {
-public:
-    void addParser(const std::string& name, exp_parser parser)
-    {
-        _parserTable.insert(std::make_pair(name, parser));
-    }
-    Expression* read(const SGPropertyNode* exp)
-    {
-        ParserMap::iterator itr = _parserTable.find(exp->getName());
-        if (itr == _parserTable.end())
-            throw ParseError(string("unknown expression ") + exp->getName());
-        exp_parser parser = itr->second;
-        return (*parser)(exp, this);
-    }
-    // XXX vector of SGSharedPtr?
-    bool readChildren(const SGPropertyNode* exp,
-                      vector<Expression*>& result);
-protected:
-    typedef std::map<const std::string, exp_parser> ParserMap;
-    ParserMap _parserTable;
-};
-
-class ExpressionParser : public Parser, public Singleton<ExpressionParser>
-{
-};
-
-void addExpParser(const string& token, exp_parser parsefn)
-{
-    ExpressionParser::instance()->addParser(token, parsefn);
-}
-
-Expression* read(const SGPropertyNode* exp, Parser* parser)
-{
-    if (!parser)
-        parser = ExpressionParser::instance();
-    return parser->read(exp);
-}
-
 bool Parser::readChildren(const SGPropertyNode* exp,
                           vector<Expression*>& result)
 {
@@ -728,6 +690,13 @@ bool Parser::readChildren(const SGPropertyNode* exp,
     return true;
 }
 
+Parser::ParserMap ExpressionParser::_parserTable;
+
+void ExpressionParser::addExpParser(const string& token, exp_parser parsefn)
+{
+    _parserTable.insert(std::make_pair(token, parsefn));
+}
+
 Expression* valueParser(const SGPropertyNode* exp, Parser* parser)
 {
     switch (exp->getType()) {
@@ -867,10 +836,14 @@ 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)
 {
     //XXX error checkint
+    vector<VariableBinding>::iterator itr
+        = find_if(bindings.begin(), bindings.end(),
+                  bind(&VariableBinding::name, _1) == name);
+    if (itr != bindings.end())
+        return itr->location;
     int result = bindings.size();
     bindings.push_back(VariableBinding(name, type, bindings.size()));
     return result;