Some prep for leafs-in-parents
This commit is contained in:
@@ -219,6 +219,8 @@ template <class T> struct NodeAllocator;
|
|||||||
struct TaggedNodePointer {
|
struct TaggedNodePointer {
|
||||||
TaggedNodePointer() = default;
|
TaggedNodePointer() = default;
|
||||||
operator struct Node *() { return (struct Node *)withoutType(); }
|
operator struct Node *() { return (struct Node *)withoutType(); }
|
||||||
|
// In preparation for when we might store leafs directly in parents
|
||||||
|
struct Node *asNodeUnsafe() { return (struct Node *)withoutType(); }
|
||||||
operator struct Node0 *() {
|
operator struct Node0 *() {
|
||||||
assert(getType() == Type_Node0);
|
assert(getType() == Type_Node0);
|
||||||
return (struct Node0 *)withoutType();
|
return (struct Node0 *)withoutType();
|
||||||
@@ -1470,7 +1472,8 @@ void consumePartialKeyFull(TaggedNodePointer &self, TrivialSpan &key,
|
|||||||
int partialKeyIndex =
|
int partialKeyIndex =
|
||||||
longestCommonPrefix(self->partialKey(), key.data(), commonLen);
|
longestCommonPrefix(self->partialKey(), key.data(), commonLen);
|
||||||
if (partialKeyIndex < self->partialKeyLen) {
|
if (partialKeyIndex < self->partialKeyLen) {
|
||||||
Node *old = self;
|
// Safety: self has a partial key so it can't be a leaf
|
||||||
|
Node *old = self.asNodeUnsafe();
|
||||||
// Since root cannot have a partial key
|
// Since root cannot have a partial key
|
||||||
assert(old->parent != nullptr);
|
assert(old->parent != nullptr);
|
||||||
InternalVersionT oldMaxVersion = exchangeMaxVersion(old, writeVersion);
|
InternalVersionT oldMaxVersion = exchangeMaxVersion(old, writeVersion);
|
||||||
@@ -1628,7 +1631,8 @@ TaggedNodePointer &getOrCreateChild(TaggedNodePointer &self, TrivialSpan &key,
|
|||||||
self3->childMaxVersion[i + 1] = newMaxVersion;
|
self3->childMaxVersion[i + 1] = newMaxVersion;
|
||||||
result = newChild;
|
result = newChild;
|
||||||
++self->numChildren;
|
++self->numChildren;
|
||||||
newChild->parent = self;
|
// Safety: self has a child so it can't be a leaf
|
||||||
|
newChild->parent = self.asNodeUnsafe();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
case Type_Node16: {
|
case Type_Node16: {
|
||||||
@@ -1660,7 +1664,8 @@ TaggedNodePointer &getOrCreateChild(TaggedNodePointer &self, TrivialSpan &key,
|
|||||||
self16->childMaxVersion[i + 1] = newMaxVersion;
|
self16->childMaxVersion[i + 1] = newMaxVersion;
|
||||||
result = newChild;
|
result = newChild;
|
||||||
++self->numChildren;
|
++self->numChildren;
|
||||||
newChild->parent = self;
|
// Safety: self has a child so it can't be a leaf
|
||||||
|
newChild->parent = self.asNodeUnsafe();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
case Type_Node48: {
|
case Type_Node48: {
|
||||||
@@ -1687,7 +1692,8 @@ TaggedNodePointer &getOrCreateChild(TaggedNodePointer &self, TrivialSpan &key,
|
|||||||
self48->maxOfMax[nextFree >> Node48::kMaxOfMaxShift] = std::max(
|
self48->maxOfMax[nextFree >> Node48::kMaxOfMaxShift] = std::max(
|
||||||
newMaxVersion, self48->maxOfMax[nextFree >> Node48::kMaxOfMaxShift]);
|
newMaxVersion, self48->maxOfMax[nextFree >> Node48::kMaxOfMaxShift]);
|
||||||
result = newChild;
|
result = newChild;
|
||||||
newChild->parent = self;
|
// Safety: self has a child so it can't be a leaf
|
||||||
|
newChild->parent = self.asNodeUnsafe();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
case Type_Node256: {
|
case Type_Node256: {
|
||||||
@@ -1701,7 +1707,8 @@ TaggedNodePointer &getOrCreateChild(TaggedNodePointer &self, TrivialSpan &key,
|
|||||||
self256->maxOfMax[index >> Node256::kMaxOfMaxShift] = std::max(
|
self256->maxOfMax[index >> Node256::kMaxOfMaxShift] = std::max(
|
||||||
newMaxVersion, self256->maxOfMax[index >> Node256::kMaxOfMaxShift]);
|
newMaxVersion, self256->maxOfMax[index >> Node256::kMaxOfMaxShift]);
|
||||||
result = newChild;
|
result = newChild;
|
||||||
newChild->parent = self;
|
// Safety: self has a child so it can't be a leaf
|
||||||
|
newChild->parent = self.asNodeUnsafe();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
default: // GCOVR_EXCL_LINE
|
default: // GCOVR_EXCL_LINE
|
||||||
@@ -1921,7 +1928,7 @@ void mergeWithChild(TaggedNodePointer &self, WriteContext *writeContext,
|
|||||||
setMaxVersion(child, std::max(childMaxVersion, writeContext->zero));
|
setMaxVersion(child, std::max(childMaxVersion, writeContext->zero));
|
||||||
|
|
||||||
self = child;
|
self = child;
|
||||||
writeContext->deferRelease(self3, self);
|
writeContext->deferRelease(self3, child);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool needsDownsize(Node *n) {
|
bool needsDownsize(Node *n) {
|
||||||
|
Reference in New Issue
Block a user