]> git.tdb.fi Git - builder.git/blobdiff - source/booleanevaluator.cpp
Refactor BooleanEvaluator to have overloaded constructors
[builder.git] / source / booleanevaluator.cpp
index ecb38fb0d07657e4ed9a1a3e574289e08bccee5b..6891abceff9a8088db506c6ea1388664830fb4f1 100644 (file)
@@ -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())
        {