diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 8dd2121..b9960c5 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -1762,8 +1762,8 @@ void eraseTree(Node *root, WriteContext *tls) { } } -void eraseBetween(Node3 *&n, int begin, int end, WriteContext *tls, - ConflictSet::Impl *impl) { +void eraseBetween(Node **inTree, 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; }; @@ -1786,12 +1786,12 @@ void eraseBetween(Node3 *&n, int begin, int end, WriteContext *tls, newNode->copyChildrenAndKeyFrom(*n); getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; + *inTree = newNode; } } -void eraseBetween(Node16 *&n, int begin, int end, WriteContext *tls, - ConflictSet::Impl *impl) { +void eraseBetween(Node **inTree, 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; }; @@ -1814,18 +1814,18 @@ void eraseBetween(Node16 *&n, int begin, int end, WriteContext *tls, newNode->copyChildrenAndKeyFrom(*n); getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; + *inTree = newNode; } else if (n->numChildren <= Node3::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; + *inTree = newNode; } } -void eraseBetween(Node48 *&n, int begin, int end, WriteContext *tls, - ConflictSet::Impl *impl) { +void eraseBetween(Node **inTree, 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; }; @@ -1858,24 +1858,24 @@ void eraseBetween(Node48 *&n, int begin, int end, WriteContext *tls, newNode->copyChildrenAndKeyFrom(*n); getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; + *inTree = newNode; } else if (n->numChildren <= Node3::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; + *inTree = newNode; } else if (n->numChildren <= Node16::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; + *inTree = newNode; } } -void eraseBetween(Node256 *&n, int begin, int end, WriteContext *tls, - ConflictSet::Impl *impl) { +void eraseBetween(Node **inTree, 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; }; @@ -1896,25 +1896,25 @@ void eraseBetween(Node256 *&n, int begin, int end, WriteContext *tls, newNode->copyChildrenAndKeyFrom(*n); getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; + *inTree = newNode; } else if (n->numChildren <= Node3::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; + *inTree = newNode; } else if (n->numChildren <= Node16::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; + *inTree = newNode; } else if (n->numChildren <= Node48::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; + *inTree = newNode; } } @@ -1930,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(&n, (Node3 *)n, begin, end, tls, impl); break; case Type_Node16: - eraseBetween((Node16 *&)n, begin, end, tls, impl); + eraseBetween(&n, (Node16 *)n, begin, end, tls, impl); break; case Type_Node48: - eraseBetween((Node48 *&)n, begin, end, tls, impl); + eraseBetween(&n, (Node48 *)n, begin, end, tls, impl); break; case Type_Node256: - eraseBetween((Node256 *&)n, begin, end, tls, impl); + eraseBetween(&n, (Node256 *)n, begin, end, tls, impl); break; default: // GCOVR_EXCL_LINE __builtin_unreachable(); // GCOVR_EXCL_LINE