From b2de5c82e3e08d2b870b73560206b620ae507d88 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Thu, 18 Jan 2024 11:58:57 -0800 Subject: [PATCH] Phase enum --- ConflictSet.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 58009b6..88167ce 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -389,25 +389,27 @@ struct ConflictSet::Impl { Node *n; Impl *impl; - int state; + enum Phase { Search, Rotate }; + Phase phase; StepwiseInsert() {} StepwiseInsert(Node **root, const Key &key, int64_t writeVersion, Impl *impl) : current(root), parent(nullptr), key(&key), writeVersion(writeVersion), - impl(impl), state(0) {} + impl(impl), phase(Search) {} bool step() { - switch (state) { - // Search - case 0: { + switch (phase) { + case Search: { if (*current == nullptr) { auto *newNode = createNode(*key, parent, writeVersion); *current = newNode; + // We could interleave the iteration in next, but we'd need a careful + // analysis for correctness and it's unlikely to be worthwhile. auto *prev = ::next(newNode, false); assert(prev != nullptr); assert(prev->rangeVersion <= writeVersion); newNode->rangeVersion = prev->rangeVersion; - state = 1; + phase = Rotate; n = *current; return false; } else { @@ -418,7 +420,7 @@ struct ConflictSet::Impl { auto c = *key <=> **current; if (c == 0) { (*current)->pointVersion = writeVersion; - state = 1; + phase = Rotate; n = *current; return false; } @@ -427,8 +429,7 @@ struct ConflictSet::Impl { } return false; } - // Rotate - case 1: { + case Rotate: { if (n->parent == nullptr) { return true; }