#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)
{
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;
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
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));
}
}
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());
{
string var = var_stack.back();
var_stack.pop_back();
- return slot(var, 0);
+ return func(var, 0);
}
else if(!value_stack.empty())
{