add a way to conditionally use rules according to predicate

master
Daniel Kolesa 2018-05-01 20:46:21 +02:00
parent 0915a9e6b5
commit 6845f5a8d8
2 changed files with 16 additions and 0 deletions

View File

@ -118,6 +118,18 @@ struct make_rule {
return *this;
}
make_rule &cond(std::function<bool(string_range)> cond_f) noexcept {
p_cond = std::move(cond_f);
return *this;
}
bool cond(string_range target) const {
if (!p_cond) {
return true;
}
return p_cond(target);
}
iterator_range<std::string const *> depends() const noexcept {
return iterator_range<std::string const *>(
p_deps.data(), p_deps.data() + p_deps.size()
@ -159,6 +171,7 @@ private:
make_pattern p_target;
std::vector<std::string> p_deps{};
body_func p_body{};
std::function<bool(string_range)> p_cond{};
bool p_action = false;
};

View File

@ -176,6 +176,9 @@ void make::find_rules(string_range target, std::vector<rule_inst> &rlist) {
rule_inst *frule = nullptr;
std::size_t pfnl = 0, psubl = 0;
for (auto &rule: p_rules) {
if (!rule.cond(target)) {
continue;
}
auto &tgt = rule.target();
auto [fnl, subl] = tgt.match(target);
if ((fnl + subl) > 0) {