X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbooleanevaluator.cpp;h=6891abceff9a8088db506c6ea1388664830fb4f1;hb=44c71b05ff282b3ce5a2d71c0f14eed97bfefea6;hp=ecb38fb0d07657e4ed9a1a3e574289e08bccee5b;hpb=02097e6a1ddbffbc2217005c3c2ebba528f5248f;p=builder.git diff --git a/source/booleanevaluator.cpp b/source/booleanevaluator.cpp index ecb38fb..6891abc 100644 --- a/source/booleanevaluator.cpp +++ b/source/booleanevaluator.cpp @@ -3,18 +3,21 @@ using namespace std; -/* 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) { string buf; last_was_op = true; - for(string::const_iterator i=str.begin();; ++i) + for(auto i=str.begin();; ++i) { if(i!=str.end() && (isalnum(*i) || (!buf.empty() && (*i=='_' || *i=='-')))) buf += *i; @@ -31,7 +34,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 @@ -81,7 +84,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()) {