From 1facea99dc5199978e9caed46f1f371883885a08 Mon Sep 17 00:00:00 2001 From: Hao Zhang Date: Thu, 12 Mar 2026 18:49:05 +0800 Subject: [PATCH] Invoke callback for partial rule in chain. --- src/chain.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/chain.cc b/src/chain.cc index 2a46342..32a930c 100644 --- a/src/chain.cc +++ b/src/chain.cc @@ -65,6 +65,7 @@ namespace ds { length_t chain_t::execute(const std::function& callback) { std::set, less_t> temp_facts; + std::set, less_t> temp_rules; bool break_all = false; @@ -84,6 +85,21 @@ namespace ds { break_all = true; } return; + } else { + do { + if (rule->data_size() > limit_size) { + break; + } + auto new_rule = std::unique_ptr(reinterpret_cast(operator new(rule->data_size()))); + memcpy(new_rule->head(), rule->head(), rule->data_size()); + if (rules.find(new_rule) != rules.end() || temp_rules.find(new_rule) != temp_rules.end()) { + break; + } + temp_rules.emplace(std::move(new_rule)); + if (callback(rule)) { + break_all = true; + } + } while (false); } for (auto& [fact, facts_cycle] : facts) {