Separate beginIsPrefix path and simplify slightly

This commit is contained in:
2024-08-15 11:29:15 -07:00
parent 73d0593fca
commit 9763452713

View File

@@ -3202,59 +3202,72 @@ void addWriteRange(Node *&root, std::span<const uint8_t> begin,
Node **useAsRoot = Node **useAsRoot =
insert(&root, begin.subspan(0, lcp), writeVersion, tls, impl); insert(&root, begin.subspan(0, lcp), writeVersion, tls, impl);
begin = begin.subspan(lcp, begin.size() - lcp);
end = end.subspan(lcp, end.size() - lcp);
int consumed = lcp; if (beginIsPrefix) {
auto *beginNode = *useAsRoot;
begin = begin.subspan(consumed, begin.size() - consumed); addKey(beginNode);
end = end.subspan(consumed, end.size() - consumed); if (!beginNode->entryPresent) {
++tls->accum.entries_inserted;
auto *beginNode = *insert(useAsRoot, begin, writeVersion, tls, impl); auto *p = nextLogical(beginNode);
beginNode->entry.rangeVersion =
const bool insertedBegin = !beginNode->entryPresent; p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
beginNode->entryPresent = true;
addKey(beginNode); }
beginNode->entryPresent = true;
if (insertedBegin) {
++tls->accum.entries_inserted;
auto *p = nextLogical(beginNode);
beginNode->entry.rangeVersion =
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
beginNode->entry.pointVersion = writeVersion; beginNode->entry.pointVersion = writeVersion;
}
assert(writeVersion >= beginNode->entry.pointVersion);
beginNode->entry.pointVersion = writeVersion;
auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl); auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl);
addKey(endNode);
const bool insertedEnd = !endNode->entryPresent; if (!endNode->entryPresent) {
++tls->accum.entries_inserted;
addKey(endNode); auto *p = nextLogical(endNode);
endNode->entryPresent = true; endNode->entry.pointVersion =
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
if (insertedEnd) {
++tls->accum.entries_inserted;
auto *p = nextLogical(endNode);
endNode->entry.pointVersion =
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
if (beginIsPrefix) {
// beginNode may have been invalidated when inserting end // beginNode may have been invalidated when inserting end
beginNode = *useAsRoot; beginNode = *useAsRoot;
assert(beginNode->entryPresent); endNode->entryPresent = true;
} }
} endNode->entry.rangeVersion = writeVersion;
endNode->entry.rangeVersion = writeVersion;
for (beginNode = nextLogical(beginNode); beginNode != endNode;
beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) {
}
// Inserting end trashed endNode's maxVersion. Fix that
fixupMaxVersion(endNode, impl, tls);
} else /*!beginIsPrefix*/ {
auto *beginNode = *insert(useAsRoot, begin, writeVersion, tls, impl);
addKey(beginNode);
if (!beginNode->entryPresent) {
++tls->accum.entries_inserted;
auto *p = nextLogical(beginNode);
beginNode->entry.rangeVersion =
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
beginNode->entryPresent = true;
}
beginNode->entry.pointVersion = writeVersion;
auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl);
addKey(endNode);
if (!endNode->entryPresent) {
++tls->accum.entries_inserted;
auto *p = nextLogical(endNode);
endNode->entry.pointVersion =
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
endNode->entryPresent = true;
}
endNode->entry.rangeVersion = writeVersion;
if (!beginIsPrefix) {
eraseBetween(*useAsRoot, begin[0] + 1, end[0], tls); eraseBetween(*useAsRoot, begin[0] + 1, end[0], tls);
}
for (beginNode = nextLogical(beginNode); beginNode != endNode; for (beginNode = nextLogical(beginNode); beginNode != endNode;
beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) { beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) {
} }
// Inserting end trashed endNode's maxVersion. Fix that // Inserting end trashed endNode's maxVersion. Fix that
fixupMaxVersion(endNode, impl, tls); fixupMaxVersion(endNode, impl, tls);
}
} }
Node *firstGeqPhysical(Node *n, const std::span<const uint8_t> key) { Node *firstGeqPhysical(Node *n, const std::span<const uint8_t> key) {