Prefer not copying node in eraseBetween

If numChildren + entryPresent is enough, we don't have to copy even if
it would fit in a smaller node.

If we have to copy, we might as well use the smallest acceptable node
type.
This commit is contained in:
2024-08-15 11:33:16 -07:00
parent 9763452713
commit 403d70a1d3

View File

@@ -1827,7 +1827,7 @@ void eraseBetween(Node **inTree, Node16 *n, int begin, int end,
n->index[i] = n->index[i + count]; n->index[i] = n->index[i + count];
} }
if (n->numChildren > Node3::kMaxNodes) { if (n->numChildren + n->entryPresent >= kMinChildrenNode16) {
// nop // nop
} else if (n->numChildren > 0) { } else if (n->numChildren > 0) {
auto *newNode = tls->allocate<Node3>(n->partialKeyLen); auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
@@ -1867,7 +1867,7 @@ void eraseBetween(Node **inTree, Node48 *n, int begin, int end,
--n->numChildren; --n->numChildren;
} }
if (n->numChildren > Node16::kMaxNodes) { if (n->numChildren + n->entryPresent >= kMinChildrenNode48) {
// nop // nop
} else if (n->numChildren > Node3::kMaxNodes) { } else if (n->numChildren > Node3::kMaxNodes) {
auto *newNode = tls->allocate<Node16>(n->partialKeyLen); auto *newNode = tls->allocate<Node16>(n->partialKeyLen);
@@ -1896,7 +1896,7 @@ void eraseBetween(Node **inTree, Node256 *n, int begin, int end,
n->bitSet.reset(i); n->bitSet.reset(i);
--n->numChildren; --n->numChildren;
} }
if (n->numChildren > Node48::kMaxNodes) { if (n->numChildren + n->entryPresent >= kMinChildrenNode256) {
// nop // nop
} else if (n->numChildren > Node16::kMaxNodes) { } else if (n->numChildren > Node16::kMaxNodes) {
auto *newNode = tls->allocate<Node48>(n->partialKeyLen); auto *newNode = tls->allocate<Node48>(n->partialKeyLen);