From 2dba0d5be32025992d8509cdbc06a78e5b321926 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Fri, 9 Aug 2024 13:58:31 -0700 Subject: [PATCH] Have insert return a pointer to the in-tree pointer --- ConflictSet.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 5fa8624..61327ad 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -2922,14 +2922,14 @@ void consumePartialKey(Node *&self, std::span &key, key = key.subspan(partialKeyIndex, key.size() - partialKeyIndex); } -// Returns a pointer to the newly inserted node. Caller must set -// `entryPresent`, and `entry` fields. All nodes along the search path of the -// result will have `maxVersion` set to `writeVersion` as a postcondition. Nodes -// along the search path may be invalidated. +// Returns a pointer the pointer to the newly inserted node in the tree. Caller +// must set `entryPresent`, and `entry` fields. All nodes along the search path +// of the result will have `maxVersion` set to `writeVersion` as a +// postcondition. Nodes along the search path may be invalidated. [[nodiscard]] -Node *insert(Node **self, std::span key, - InternalVersionT writeVersion, WriteContext *tls, - ConflictSet::Impl *impl) { +Node **insert(Node **self, std::span key, + InternalVersionT writeVersion, WriteContext *tls, + ConflictSet::Impl *impl) { if ((*self)->partialKeyLen > 0) { consumePartialKey(*self, key, writeVersion, tls); @@ -2940,7 +2940,7 @@ Node *insert(Node **self, std::span key, for (;; ++tls->accum.insert_iterations) { if (key.size() == 0) { - return *self; + return self; } auto &child = getOrCreateChild(*self, key.front(), writeVersion, tls); @@ -2953,7 +2953,7 @@ Node *insert(Node **self, std::span key, child->parentsIndex = key.front(); setMaxVersion(child, impl, writeVersion); memcpy(child->partialKey(), key.data() + 1, child->partialKeyLen); - return child; + return &child; } self = &child; @@ -2996,7 +2996,7 @@ void addPointWrite(Node *&root, std::span key, InternalVersionT writeVersion, WriteContext *tls, ConflictSet::Impl *impl) { ++tls->accum.point_writes; - auto *n = insert(&root, key, writeVersion, tls, impl); + auto *n = *insert(&root, key, writeVersion, tls, impl); if (!n->entryPresent) { ++tls->accum.entries_inserted; auto *p = nextLogical(n); @@ -3097,7 +3097,7 @@ void addWriteRange(Node *&root, std::span begin, begin = begin.subspan(consumed, begin.size() - consumed); end = end.subspan(consumed, end.size() - consumed); - auto *beginNode = insert(useAsRoot, begin, writeVersion, tls, impl); + auto *beginNode = *insert(useAsRoot, begin, writeVersion, tls, impl); const bool insertedBegin = !beginNode->entryPresent; @@ -3114,7 +3114,7 @@ void addWriteRange(Node *&root, std::span begin, assert(writeVersion >= beginNode->entry.pointVersion); beginNode->entry.pointVersion = writeVersion; - auto *endNode = insert(useAsRoot, end, writeVersion, tls, impl); + auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl); const bool insertedEnd = !endNode->entryPresent; @@ -3132,7 +3132,7 @@ void addWriteRange(Node *&root, std::span begin, if (beginIsPrefix && insertedEnd) { // beginNode may have been invalidated when inserting end. TODO can we do // better? - beginNode = insert(useAsRoot, begin, writeVersion, tls, impl); + beginNode = *insert(useAsRoot, begin, writeVersion, tls, impl); assert(beginNode->entryPresent); }