Accept node by ref for eraseBetween again
This commit is contained in:
@@ -1762,7 +1762,7 @@ 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;
|
||||
@@ -1786,10 +1786,11 @@ void eraseBetween(Node3 *n, int begin, int end, WriteContext *tls,
|
||||
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;
|
||||
@@ -1813,15 +1814,17 @@ void eraseBetween(Node16 *n, int begin, int end, WriteContext *tls,
|
||||
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;
|
||||
@@ -1855,20 +1858,23 @@ void eraseBetween(Node48 *n, int begin, int end, WriteContext *tls,
|
||||
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;
|
||||
@@ -1890,27 +1896,31 @@ void eraseBetween(Node256 *n, int begin, int end, WriteContext *tls,
|
||||
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",
|
||||
@@ -1920,16 +1930,16 @@ void eraseBetween(Node *n, int begin, int end, WriteContext *tls,
|
||||
case Type_Node0:
|
||||
break;
|
||||
case Type_Node3:
|
||||
eraseBetween((Node3 *)n, begin, end, tls, impl);
|
||||
eraseBetween((Node3 *&)n, begin, end, tls, impl);
|
||||
break;
|
||||
case Type_Node16:
|
||||
eraseBetween((Node16 *)n, begin, end, tls, impl);
|
||||
eraseBetween((Node16 *&)n, begin, end, tls, impl);
|
||||
break;
|
||||
case Type_Node48:
|
||||
eraseBetween((Node48 *)n, begin, end, tls, impl);
|
||||
eraseBetween((Node48 *&)n, begin, end, tls, impl);
|
||||
break;
|
||||
case Type_Node256:
|
||||
eraseBetween((Node256 *)n, begin, end, tls, impl);
|
||||
eraseBetween((Node256 *&)n, begin, end, tls, impl);
|
||||
break;
|
||||
default: // GCOVR_EXCL_LINE
|
||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||
|
Reference in New Issue
Block a user