Save a few instructions in addWriteRange

This commit is contained in:
2024-02-22 15:25:50 -08:00
parent 8016d44c04
commit 7f5598af2b

View File

@@ -285,6 +285,27 @@ Node *&getChildExists(Node *self, uint8_t index) {
__builtin_unreachable(); // GCOVR_EXCL_LINE
}
Node *getChild(Node *self, uint8_t index) {
if (self->type <= Type::Node16) {
auto *self16 = static_cast<Node16 *>(self);
int i = getNodeIndex(self16, index);
if (i >= 0) {
return self16->children[i];
}
return nullptr;
} else if (self->type == Type::Node48) {
auto *self48 = static_cast<Node48 *>(self);
int secondIndex = self48->index[index];
if (secondIndex >= 0) {
return self48->children[secondIndex];
}
return nullptr;
} else {
auto *self256 = static_cast<Node256 *>(self);
return self256->children[index];
}
}
int getChildGeq(Node *self, int child) {
if (child > 255) {
return -1;
@@ -1466,21 +1487,17 @@ void addWriteRange(Node *&root, int64_t oldestVersion,
auto *n = root;
for (;;) {
if (int(remaining.size()) < n->partialKeyLen + 1) {
if (int(remaining.size()) <= n->partialKeyLen) {
break;
}
int i = 0;
for (; i < n->partialKeyLen; ++i) {
if (remaining[i] != n->partialKey[i]) {
break;
}
}
int i = longestCommonPrefixPartialKey(n->partialKey, remaining.data(),
n->partialKeyLen);
if (i != n->partialKeyLen) {
break;
}
int c = getChildGeq(n, remaining[n->partialKeyLen]);
if (c != remaining[n->partialKeyLen]) {
auto *child = getChild(n, remaining[n->partialKeyLen]);
if (child == nullptr) {
break;
}
@@ -1488,7 +1505,7 @@ void addWriteRange(Node *&root, int64_t oldestVersion,
remaining = remaining.subspan(n->partialKeyLen + 1,
remaining.size() - (n->partialKeyLen + 1));
n = getChildExists(n, c);
n = child;
}
Node **useAsRoot = n->parent == nullptr