3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-22 16:45:31 +00:00

DoC: specialize union for the case dst=empty and/or delta=empty

this avoids O(n^2) insert and becomes O(n)

Signed-off-by: Nuno Lopes <a-nlopes@microsoft.com>
This commit is contained in:
Nuno Lopes 2015-01-29 08:50:12 +00:00
parent 1701af9dc9
commit 2e083ab9c2

View file

@ -509,13 +509,27 @@ namespace datalog {
}
};
void udoc_plugin::mk_union(doc_manager& dm, udoc& dst, udoc const& src, udoc* delta) {
for (unsigned i = 0; i < src.size(); ++i) {
doc* d = dm.allocate(src[i]);
if (dst.insert(dm, d)) {
bool deltaempty = delta ? delta->is_empty() : false;
if (dst.is_empty()) {
for (unsigned i = 0; i < src.size(); ++i) {
dst.push_back(dm.allocate(src[i]));
if (delta) {
delta->insert(dm, dm.allocate(src[i]));
if (deltaempty)
delta->push_back(dm.allocate(src[i]));
else
delta->insert(dm, dm.allocate(src[i]));
}
}
}
} else {
for (unsigned i = 0; i < src.size(); ++i) {
if (dst.insert(dm, dm.allocate(src[i])) && delta) {
if (deltaempty)
delta->push_back(dm.allocate(src[i]));
else
delta->insert(dm, dm.allocate(src[i]));
}
}
}
}
relation_union_fn * udoc_plugin::mk_union_fn(