Have eraseBetween take in-tree node by reference
This commit is contained in:
@@ -1763,7 +1763,7 @@ void eraseTree(Node *root, WriteContext *tls) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void eraseBetween(Node **inTree, Node3 *n, int begin, int end,
|
void eraseBetween(Node **inTree, Node3 *n, int begin, int end,
|
||||||
WriteContext *tls, ConflictSet::Impl *impl) {
|
WriteContext *tls) {
|
||||||
const unsigned shiftUpperBound = end - begin;
|
const unsigned shiftUpperBound = end - begin;
|
||||||
const unsigned shiftAmount = begin;
|
const unsigned shiftAmount = begin;
|
||||||
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
|
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
|
||||||
@@ -1784,14 +1784,13 @@ void eraseBetween(Node **inTree, Node3 *n, int begin, int end,
|
|||||||
if (n->numChildren == 0) {
|
if (n->numChildren == 0) {
|
||||||
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
|
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
|
||||||
newNode->copyChildrenAndKeyFrom(*n);
|
newNode->copyChildrenAndKeyFrom(*n);
|
||||||
getInTree(n, impl) = newNode;
|
|
||||||
tls->release(n);
|
tls->release(n);
|
||||||
*inTree = newNode;
|
*inTree = newNode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void eraseBetween(Node **inTree, Node16 *n, int begin, int end,
|
void eraseBetween(Node **inTree, Node16 *n, int begin, int end,
|
||||||
WriteContext *tls, ConflictSet::Impl *impl) {
|
WriteContext *tls) {
|
||||||
const unsigned shiftUpperBound = end - begin;
|
const unsigned shiftUpperBound = end - begin;
|
||||||
const unsigned shiftAmount = begin;
|
const unsigned shiftAmount = begin;
|
||||||
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
|
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
|
||||||
@@ -1812,20 +1811,18 @@ void eraseBetween(Node **inTree, Node16 *n, int begin, int end,
|
|||||||
if (n->numChildren == 0) {
|
if (n->numChildren == 0) {
|
||||||
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
|
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
|
||||||
newNode->copyChildrenAndKeyFrom(*n);
|
newNode->copyChildrenAndKeyFrom(*n);
|
||||||
getInTree(n, impl) = newNode;
|
|
||||||
tls->release(n);
|
tls->release(n);
|
||||||
*inTree = newNode;
|
*inTree = newNode;
|
||||||
} else if (n->numChildren <= Node3::kMaxNodes) {
|
} else if (n->numChildren <= Node3::kMaxNodes) {
|
||||||
auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
|
auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
|
||||||
newNode->copyChildrenAndKeyFrom(*n);
|
newNode->copyChildrenAndKeyFrom(*n);
|
||||||
getInTree(n, impl) = newNode;
|
|
||||||
tls->release(n);
|
tls->release(n);
|
||||||
*inTree = newNode;
|
*inTree = newNode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void eraseBetween(Node **inTree, Node48 *n, int begin, int end,
|
void eraseBetween(Node **inTree, Node48 *n, int begin, int end,
|
||||||
WriteContext *tls, ConflictSet::Impl *impl) {
|
WriteContext *tls) {
|
||||||
const unsigned shiftUpperBound = end - begin;
|
const unsigned shiftUpperBound = end - begin;
|
||||||
const unsigned shiftAmount = begin;
|
const unsigned shiftAmount = begin;
|
||||||
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
|
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
|
||||||
@@ -1856,26 +1853,23 @@ void eraseBetween(Node **inTree, Node48 *n, int begin, int end,
|
|||||||
if (n->numChildren == 0) {
|
if (n->numChildren == 0) {
|
||||||
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
|
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
|
||||||
newNode->copyChildrenAndKeyFrom(*n);
|
newNode->copyChildrenAndKeyFrom(*n);
|
||||||
getInTree(n, impl) = newNode;
|
|
||||||
tls->release(n);
|
tls->release(n);
|
||||||
*inTree = newNode;
|
*inTree = newNode;
|
||||||
} else if (n->numChildren <= Node3::kMaxNodes) {
|
} else if (n->numChildren <= Node3::kMaxNodes) {
|
||||||
auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
|
auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
|
||||||
newNode->copyChildrenAndKeyFrom(*n);
|
newNode->copyChildrenAndKeyFrom(*n);
|
||||||
getInTree(n, impl) = newNode;
|
|
||||||
tls->release(n);
|
tls->release(n);
|
||||||
*inTree = newNode;
|
*inTree = newNode;
|
||||||
} else if (n->numChildren <= Node16::kMaxNodes) {
|
} else if (n->numChildren <= Node16::kMaxNodes) {
|
||||||
auto *newNode = tls->allocate<Node16>(n->partialKeyLen);
|
auto *newNode = tls->allocate<Node16>(n->partialKeyLen);
|
||||||
newNode->copyChildrenAndKeyFrom(*n);
|
newNode->copyChildrenAndKeyFrom(*n);
|
||||||
getInTree(n, impl) = newNode;
|
|
||||||
tls->release(n);
|
tls->release(n);
|
||||||
*inTree = newNode;
|
*inTree = newNode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void eraseBetween(Node **inTree, Node256 *n, int begin, int end,
|
void eraseBetween(Node **inTree, Node256 *n, int begin, int end,
|
||||||
WriteContext *tls, ConflictSet::Impl *impl) {
|
WriteContext *tls) {
|
||||||
const unsigned shiftUpperBound = end - begin;
|
const unsigned shiftUpperBound = end - begin;
|
||||||
const unsigned shiftAmount = begin;
|
const unsigned shiftAmount = begin;
|
||||||
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
|
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
|
||||||
@@ -1894,25 +1888,21 @@ void eraseBetween(Node **inTree, Node256 *n, int begin, int end,
|
|||||||
if (n->numChildren == 0) {
|
if (n->numChildren == 0) {
|
||||||
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
|
auto *newNode = tls->allocate<Node0>(n->partialKeyLen);
|
||||||
newNode->copyChildrenAndKeyFrom(*n);
|
newNode->copyChildrenAndKeyFrom(*n);
|
||||||
getInTree(n, impl) = newNode;
|
|
||||||
tls->release(n);
|
tls->release(n);
|
||||||
*inTree = newNode;
|
*inTree = newNode;
|
||||||
} else if (n->numChildren <= Node3::kMaxNodes) {
|
} else if (n->numChildren <= Node3::kMaxNodes) {
|
||||||
auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
|
auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
|
||||||
newNode->copyChildrenAndKeyFrom(*n);
|
newNode->copyChildrenAndKeyFrom(*n);
|
||||||
getInTree(n, impl) = newNode;
|
|
||||||
tls->release(n);
|
tls->release(n);
|
||||||
*inTree = newNode;
|
*inTree = newNode;
|
||||||
} else if (n->numChildren <= Node16::kMaxNodes) {
|
} else if (n->numChildren <= Node16::kMaxNodes) {
|
||||||
auto *newNode = tls->allocate<Node16>(n->partialKeyLen);
|
auto *newNode = tls->allocate<Node16>(n->partialKeyLen);
|
||||||
newNode->copyChildrenAndKeyFrom(*n);
|
newNode->copyChildrenAndKeyFrom(*n);
|
||||||
getInTree(n, impl) = newNode;
|
|
||||||
tls->release(n);
|
tls->release(n);
|
||||||
*inTree = newNode;
|
*inTree = newNode;
|
||||||
} else if (n->numChildren <= Node48::kMaxNodes) {
|
} else if (n->numChildren <= Node48::kMaxNodes) {
|
||||||
auto *newNode = tls->allocate<Node48>(n->partialKeyLen);
|
auto *newNode = tls->allocate<Node48>(n->partialKeyLen);
|
||||||
newNode->copyChildrenAndKeyFrom(*n);
|
newNode->copyChildrenAndKeyFrom(*n);
|
||||||
getInTree(n, impl) = newNode;
|
|
||||||
tls->release(n);
|
tls->release(n);
|
||||||
*inTree = newNode;
|
*inTree = newNode;
|
||||||
}
|
}
|
||||||
@@ -1920,8 +1910,7 @@ void eraseBetween(Node **inTree, Node256 *n, int begin, int end,
|
|||||||
|
|
||||||
// Erase all nodes with a search path starting with n + [child],
|
// Erase all nodes with a search path starting with n + [child],
|
||||||
// where child in [begin, end).
|
// 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)
|
#if DEBUG_VERBOSE && !defined(NDEBUG)
|
||||||
fprintf(stderr, "eraseBetween: %s + [%d,%d)\n",
|
fprintf(stderr, "eraseBetween: %s + [%d,%d)\n",
|
||||||
getSearchPathPrintable(n).c_str(), begin, end);
|
getSearchPathPrintable(n).c_str(), begin, end);
|
||||||
@@ -1930,16 +1919,16 @@ void eraseBetween(Node *&n, int begin, int end, WriteContext *tls,
|
|||||||
case Type_Node0:
|
case Type_Node0:
|
||||||
break;
|
break;
|
||||||
case Type_Node3:
|
case Type_Node3:
|
||||||
eraseBetween(&n, (Node3 *)n, begin, end, tls, impl);
|
eraseBetween(&n, (Node3 *)n, begin, end, tls);
|
||||||
break;
|
break;
|
||||||
case Type_Node16:
|
case Type_Node16:
|
||||||
eraseBetween(&n, (Node16 *)n, begin, end, tls, impl);
|
eraseBetween(&n, (Node16 *)n, begin, end, tls);
|
||||||
break;
|
break;
|
||||||
case Type_Node48:
|
case Type_Node48:
|
||||||
eraseBetween(&n, (Node48 *)n, begin, end, tls, impl);
|
eraseBetween(&n, (Node48 *)n, begin, end, tls);
|
||||||
break;
|
break;
|
||||||
case Type_Node256:
|
case Type_Node256:
|
||||||
eraseBetween(&n, (Node256 *)n, begin, end, tls, impl);
|
eraseBetween(&n, (Node256 *)n, begin, end, tls);
|
||||||
break;
|
break;
|
||||||
default: // GCOVR_EXCL_LINE
|
default: // GCOVR_EXCL_LINE
|
||||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||||
@@ -3228,7 +3217,7 @@ void addPrefixWrite(Node *&root, std::span<const uint8_t> begin,
|
|||||||
}
|
}
|
||||||
endNode->entry.rangeVersion = writeVersion;
|
endNode->entry.rangeVersion = writeVersion;
|
||||||
|
|
||||||
eraseBetween(beginNode, 0, 256, tls, impl);
|
eraseBetween(getInTree(beginNode, impl), 0, 256, tls);
|
||||||
|
|
||||||
// Inserting end trashed endNode's maxVersion. Fix that
|
// Inserting end trashed endNode's maxVersion. Fix that
|
||||||
fixupMaxVersion(endNode, impl, tls);
|
fixupMaxVersion(endNode, impl, tls);
|
||||||
|
Reference in New Issue
Block a user