]> git.tdb.fi Git - builder.git/blobdiff - source/booleanevaluator.cpp
Capture value evaluation function by value
[builder.git] / source / booleanevaluator.cpp
index 01037415d2bf36ee9d012f59840e5463151b1cf9..b7c399f9cbc97c58384f0a732c8a6bf1accdc797 100644 (file)
@@ -1,13 +1,18 @@
 #include <stdexcept>
+#include <msp/strings/format.h>
 #include "booleanevaluator.h"
 
 using namespace std;
+using namespace Msp;
 
-/* I'd rather have overloads with different slots, but that creates an
-ambiguity because slots have template constructors. */
-BooleanEvaluator::BooleanEvaluator(const Slot &s, bool allow_compare):
-       slot(s),
-       ops(allow_compare ? "&|!=^" : "&|!")
+BooleanEvaluator::BooleanEvaluator(const ValueFunction &f):
+       func([f](const string &value, const string *){ return f(value); }),
+       ops("&|!")
+{ }
+
+BooleanEvaluator::BooleanEvaluator(const CompareFunction &f):
+       func(f),
+       ops("&|!=^")
 { }
 
 bool BooleanEvaluator::evaluate(const string &str)
@@ -31,7 +36,7 @@ bool BooleanEvaluator::evaluate(const string &str)
                                        op_stack.pop_back();
                                        string var = var_stack.back();
                                        var_stack.pop_back();
-                                       bool value = (slot(var, &buf) == (op=='='));
+                                       bool value = (func(var, &buf) == (op=='='));
                                        value_stack.push_back(value);
                                }
                                else
@@ -48,7 +53,7 @@ bool BooleanEvaluator::evaluate(const string &str)
                        else if(ops.find(*i)!=string::npos)
                                push_op(*i);
                        else
-                               throw runtime_error("syntax error at "+string(1, *i));
+                               throw runtime_error(format("syntax error at %c", *i));
                }
        }
 
@@ -64,7 +69,7 @@ bool BooleanEvaluator::evaluate(const string &str)
 void BooleanEvaluator::push_op(char op)
 {
        if(last_was_op!=is_unary(op))
-               throw runtime_error("syntax error at "+string(1, op));
+               throw runtime_error(format("syntax error at %c", op));
        // TODO Disallow mixing of ! and =/^
        if(is_logic(op) && !var_stack.empty())
                value_stack.push_back(pop_value());
@@ -81,7 +86,7 @@ bool BooleanEvaluator::pop_value()
        {
                string var = var_stack.back();
                var_stack.pop_back();
-               return slot(var, 0);
+               return func(var, 0);
        }
        else if(!value_stack.empty())
        {