Use getInTree in eraseBetween

This commit is contained in:
2024-08-13 17:39:25 -07:00
parent 3078845673
commit 68bbacb69a

View File

@@ -1762,7 +1762,8 @@ void destroyTree(Node *root, WriteContext::Accum *accum) {
}
}
void eraseBetween(Node3 *&n, int begin, int end, WriteContext *tls) {
void eraseBetween(Node3 *n, int begin, int end, WriteContext *tls,
ConflictSet::Impl *impl) {
const unsigned shiftUpperBound = end - begin;
const unsigned shiftAmount = begin;
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
@@ -1783,12 +1784,13 @@ void eraseBetween(Node3 *&n, int begin, int end, WriteContext *tls) {
if (n->numChildren == 0) {
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode;
tls->release(n);
(Node *&)n = newNode;
}
}
void eraseBetween(Node16 *&n, int begin, int end, WriteContext *tls) {
void eraseBetween(Node16 *n, int begin, int end, WriteContext *tls,
ConflictSet::Impl *impl) {
const unsigned shiftUpperBound = end - begin;
const unsigned shiftAmount = begin;
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
@@ -1809,17 +1811,18 @@ void eraseBetween(Node16 *&n, int begin, int end, WriteContext *tls) {
if (n->numChildren == 0) {
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode;
tls->release(n);
(Node *&)n = newNode;
} else if (n->numChildren <= Node3::kMaxNodes) {
auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode;
tls->release(n);
(Node *&)n = newNode;
}
}
void eraseBetween(Node48 *&n, int begin, int end, WriteContext *tls) {
void eraseBetween(Node48 *n, int begin, int end, WriteContext *tls,
ConflictSet::Impl *impl) {
const unsigned shiftUpperBound = end - begin;
const unsigned shiftAmount = begin;
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
@@ -1850,22 +1853,23 @@ void eraseBetween(Node48 *&n, int begin, int end, WriteContext *tls) {
if (n->numChildren == 0) {
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode;
tls->release(n);
(Node *&)n = newNode;
} else if (n->numChildren <= Node3::kMaxNodes) {
auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode;
tls->release(n);
(Node *&)n = newNode;
} else if (n->numChildren <= Node16::kMaxNodes) {
auto *newNode = tls->allocate<Node16>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode;
tls->release(n);
(Node *&)n = newNode;
}
}
void eraseBetween(Node256 *&n, int begin, int end, WriteContext *tls) {
void eraseBetween(Node256 *n, int begin, int end, WriteContext *tls,
ConflictSet::Impl *impl) {
const unsigned shiftUpperBound = end - begin;
const unsigned shiftAmount = begin;
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
@@ -1884,43 +1888,48 @@ void eraseBetween(Node256 *&n, int begin, int end, WriteContext *tls) {
if (n->numChildren == 0) {
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode;
tls->release(n);
(Node *&)n = newNode;
} else if (n->numChildren <= Node3::kMaxNodes) {
auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode;
tls->release(n);
(Node *&)n = newNode;
} else if (n->numChildren <= Node16::kMaxNodes) {
auto *newNode = tls->allocate<Node16>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode;
tls->release(n);
(Node *&)n = newNode;
} else if (n->numChildren <= Node48::kMaxNodes) {
auto *newNode = tls->allocate<Node48>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode;
tls->release(n);
(Node *&)n = newNode;
}
}
// Erase all nodes with a search path starting with n + [child],
// where child in [begin, end).
void eraseBetween(Node *&n, int begin, int end, WriteContext *tls) {
void eraseBetween(Node *n, int begin, int end, WriteContext *tls,
ConflictSet::Impl *impl) {
#if DEBUG_VERBOSE && !defined(NDEBUG)
fprintf(stderr, "eraseBetween: %s + [%d,%d)\n",
getSearchPathPrintable(n).c_str(), begin, end);
#endif
switch (n->getType()) {
case Type_Node0:
break;
case Type_Node3:
eraseBetween((Node3 *&)n, begin, end, tls);
eraseBetween((Node3 *)n, begin, end, tls, impl);
break;
case Type_Node16:
eraseBetween((Node16 *&)n, begin, end, tls);
eraseBetween((Node16 *)n, begin, end, tls, impl);
break;
case Type_Node48:
eraseBetween((Node48 *&)n, begin, end, tls);
eraseBetween((Node48 *)n, begin, end, tls, impl);
break;
case Type_Node256:
eraseBetween((Node256 *&)n, begin, end, tls);
eraseBetween((Node256 *)n, begin, end, tls, impl);
break;
default: // GCOVR_EXCL_LINE
__builtin_unreachable(); // GCOVR_EXCL_LINE
@@ -3209,7 +3218,7 @@ void addPrefixWrite(Node *&root, std::span<const uint8_t> begin,
}
endNode->entry.rangeVersion = writeVersion;
eraseBetween(getInTree(beginNode, impl), 0, 256, tls);
eraseBetween(beginNode, 0, 256, tls, impl);
// Inserting end trashed endNode's maxVersion. Fix that
fixupMaxVersion(endNode, impl, tls);