]> git.tdb.fi Git - builder.git/commitdiff
Refactor BooleanEvaluator to have overloaded constructors
authorMikko Rasa <tdb@tdb.fi>
Mon, 19 Dec 2022 19:00:51 +0000 (21:00 +0200)
committerMikko Rasa <tdb@tdb.fi>
Mon, 19 Dec 2022 19:13:46 +0000 (21:13 +0200)
The signature of the function passed in is now used to determine if
comparison operators are permitted.

source/booleanevaluator.cpp
source/booleanevaluator.h
source/conditionalloader.cpp

index 074956a7a29b4cfddca039b1506eaaf30bf5dabb..6891abceff9a8088db506c6ea1388664830fb4f1 100644 (file)
@@ -3,11 +3,14 @@
 
 using namespace std;
 
-/* I'd rather have overloads with different slots, but that creates an
-ambiguity because slots have template constructors. */
-BooleanEvaluator::BooleanEvaluator(const Function &f, bool 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(allow_compare ? "&|!=^" : "&|!")
+       ops("&|!=^")
 { }
 
 bool BooleanEvaluator::evaluate(const string &str)
index 7c2af6f1a0f9cbeb8d99d546c89d50172520e5a4..c3f61f2b543e943878465e3aea564ff87d7cf759 100644 (file)
@@ -8,10 +8,11 @@
 class BooleanEvaluator
 {
 public:
-       using Function = std::function<bool(const std::string &, const std::string *)>;
+       using ValueFunction = std::function<bool(const std::string &)>;
+       using CompareFunction = std::function<bool(const std::string &, const std::string *)>;
 
 private:
-       Function func;
+       CompareFunction func;
        std::string ops;
        std::vector<std::string> var_stack;
        std::vector<unsigned char> value_stack;
@@ -19,7 +20,8 @@ private:
        bool last_was_op;
 
 public:
-       BooleanEvaluator(const Function &, bool = true);
+       BooleanEvaluator(const ValueFunction &);
+       BooleanEvaluator(const CompareFunction &);
 
        bool evaluate(const std::string &);
 private:
index 731c5594c312a1d9cd18cd985c325f7806f1bc96..623343549f842100df978091b65f711ddc87aac5 100644 (file)
@@ -17,7 +17,7 @@ ArchitectureConditional::ArchitectureConditional(const Builder &b, const string
 void ArchitectureConditional::if_arch(const string &cond)
 {
        const Architecture &arch = builder.get_current_arch();
-       BooleanEvaluator eval([&arch](const string &value, const string *){ return arch.match_name(value); }, false);
+       BooleanEvaluator eval([&arch](const string &value){ return arch.match_name(value); });
        bool match = eval.evaluate(cond);
        builder.get_logger().log("configure", format("%s: arch %s %smatched", log_prefix, cond, (match ? "" : "not ")));
        if(match)