diff --git a/ConflictSet.cpp b/ConflictSet.cpp index dc8521b..86b5b26 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -1409,27 +1409,26 @@ bool checkRangeRead(Node *n, std::span begin, // !entryPresent. The search path of the result's parent will have // `maxVersion` at least `writeVersion` as a postcondition. template -[[nodiscard]] Node *insert(Node **self_, std::span key, +[[nodiscard]] Node *insert(Node **self, std::span key, int64_t writeVersion, NodeAllocators *allocators) { for (;;) { - auto &self = *self_; // Handle an existing partial key - int commonLen = std::min(self->partialKeyLen, key.size()); - int partialKeyIndex = - longestCommonPrefixPartialKey(self->partialKey, key.data(), commonLen); - if (partialKeyIndex < self->partialKeyLen) { - auto *old = self; + int commonLen = std::min((*self)->partialKeyLen, key.size()); + int partialKeyIndex = longestCommonPrefixPartialKey((*self)->partialKey, + key.data(), commonLen); + if (partialKeyIndex < (*self)->partialKeyLen) { + auto *old = *self; - self = allocators->node4.allocate(); + *self = allocators->node4.allocate(); - memcpy((void *)self, old, offsetof(Node, type)); - self->partialKeyLen = partialKeyIndex; - self->entryPresent = false; - self->numChildren = 0; + memcpy((void *)*self, old, offsetof(Node, type)); + (*self)->partialKeyLen = partialKeyIndex; + (*self)->entryPresent = false; + (*self)->numChildren = 0; - getOrCreateChild(self, old->partialKey[partialKeyIndex], allocators) = + getOrCreateChild(*self, old->partialKey[partialKeyIndex], allocators) = old; - old->parent = self; + old->parent = *self; old->parentsIndex = old->partialKey[partialKeyIndex]; memmove(old->partialKey, old->partialKey + partialKeyIndex + 1, @@ -1439,34 +1438,36 @@ template key = key.subspan(partialKeyIndex, key.size() - partialKeyIndex); // Consider adding a partial key - if (self->numChildren == 0 && !self->entryPresent) { - self->partialKeyLen = std::min(key.size(), self->kPartialKeyMaxLen); - memcpy(self->partialKey, key.data(), self->partialKeyLen); - key = key.subspan(self->partialKeyLen, key.size() - self->partialKeyLen); + if ((*self)->numChildren == 0 && !(*self)->entryPresent) { + (*self)->partialKeyLen = + std::min(key.size(), (*self)->kPartialKeyMaxLen); + memcpy((*self)->partialKey, key.data(), (*self)->partialKeyLen); + key = key.subspan((*self)->partialKeyLen, + key.size() - (*self)->partialKeyLen); } if constexpr (kBegin) { - self->maxVersion = std::max(self->maxVersion, writeVersion); + (*self)->maxVersion = std::max((*self)->maxVersion, writeVersion); } if (key.size() == 0) { - return self; + return *self; } if constexpr (!kBegin) { - self->maxVersion = std::max(self->maxVersion, writeVersion); + (*self)->maxVersion = std::max((*self)->maxVersion, writeVersion); } - auto &child = getOrCreateChild(self, key.front(), allocators); + auto &child = getOrCreateChild((*self), key.front(), allocators); if (!child) { child = allocators->node4.allocate(); - child->parent = self; + child->parent = (*self); child->parentsIndex = key.front(); child->maxVersion = kBegin ? writeVersion : std::numeric_limits::lowest(); } - self_ = &child; + self = &child; key = key.subspan(1, key.size() - 1); } }