From 4b82502946d7c6e59f9673f9deccd0398fcb30e4 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Tue, 13 Aug 2024 17:43:29 -0700 Subject: [PATCH] Accept node by ref for eraseBetween again --- ConflictSet.cpp | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index f8c2d06..66a0a7d 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -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(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(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(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(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(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(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