X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbooleanevaluator.cpp;h=b7c399f9cbc97c58384f0a732c8a6bf1accdc797;hb=eeb32cca939697d04254f84b81b68d9b1b14951d;hp=01037415d2bf36ee9d012f59840e5463151b1cf9;hpb=7c2db9e2b91da953701be233336c5bfa1f3c4af0;p=builder.git diff --git a/source/booleanevaluator.cpp b/source/booleanevaluator.cpp index 0103741..b7c399f 100644 --- a/source/booleanevaluator.cpp +++ b/source/booleanevaluator.cpp @@ -1,13 +1,18 @@ #include +#include #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()) {