diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 1997bd8..a07a14d 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -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(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(self); + int secondIndex = self48->index[index]; + if (secondIndex >= 0) { + return self48->children[secondIndex]; + } + return nullptr; + } else { + auto *self256 = static_cast(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