From 6a12210866f683853770eea997e573ca4b3b59c8 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Fri, 11 Oct 2024 21:06:57 -0700 Subject: [PATCH] Make better use of static node type info for check left side --- ConflictSet.cpp | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 7106784..ddba01a 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -3333,7 +3333,7 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) { MUSTTAIL return done_common_prefix_iter(job, context); } } - job->n = job->child; + job->n = child; job->remaining = job->remaining.subspan(1 + child->partialKeyLen, job->remaining.size() - (1 + child->partialKeyLen)); @@ -3344,7 +3344,7 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) { MUSTTAIL return done_common_prefix_iter(job, context); } - auto c = getChild(job->n, job->remaining[0]); + auto c = getChild(child, job->remaining[0]); job->child = c; if (job->child == nullptr) { MUSTTAIL return done_common_prefix_iter(job, context); @@ -3456,34 +3456,36 @@ FLATTEN PRESERVE_NONE void done_common_prefix_iter(CheckJob *job, template FLATTEN PRESERVE_NONE void left_side_iter(CheckJob *job, CheckContext *context) { + assert(NodeT::kType == job->n->getType()); + NodeT *n = static_cast(job->n); + job->remaining = job->remaining.subspan(1, job->remaining.size() - 1); ++job->searchPathLen; - if (job->n->partialKeyLen > 0) { - int commonLen = std::min(job->n->partialKeyLen, job->remaining.size()); - int i = longestCommonPrefix(job->n->partialKey(), job->remaining.data(), - commonLen); + if (n->partialKeyLen > 0) { + int commonLen = std::min(n->partialKeyLen, job->remaining.size()); + int i = + longestCommonPrefix(n->partialKey(), job->remaining.data(), commonLen); job->searchPathLen += i; if (i < commonLen) { - auto c = job->n->partialKey()[i] <=> job->remaining[i]; + auto c = n->partialKey()[i] <=> job->remaining[i]; if (c > 0) { if (job->searchPathLen < job->prefixLen) { job->continuation = left_side_down_left_spine; MUSTTAIL return job->continuation(job, context); } - if (job->n->entryPresent && - job->n->entry.rangeVersion > job->readVersion) { + if (n->entryPresent && n->entry.rangeVersion > job->readVersion) { job->setResult(false); MUSTTAIL return complete(job, context); } - if (maxVersion(job->n) > job->readVersion) { + if (maxVersion(n) > job->readVersion) { job->setResult(false); MUSTTAIL return complete(job, context); } job->continuation = done_left_side_iter; MUSTTAIL return job->continuation(job, context); } else { - job->n = nextSibling(job->n); + job->n = nextSibling(n); if (job->n == nullptr) { job->continuation = done_left_side_iter; MUSTTAIL return job->continuation(job, context); @@ -3492,18 +3494,17 @@ FLATTEN PRESERVE_NONE void left_side_iter(CheckJob *job, MUSTTAIL return job->continuation(job, context); } } - if (commonLen == job->n->partialKeyLen) { + if (commonLen == n->partialKeyLen) { // partial key matches job->remaining = job->remaining.subspan(commonLen, job->remaining.size() - commonLen); - } else if (job->n->partialKeyLen > int(job->remaining.size())) { + } else if (n->partialKeyLen > int(job->remaining.size())) { assert(job->searchPathLen >= job->prefixLen); - if (job->n->entryPresent && - job->n->entry.rangeVersion > job->readVersion) { + if (n->entryPresent && n->entry.rangeVersion > job->readVersion) { job->setResult(false); MUSTTAIL return complete(job, context); } - if (maxVersion(job->n) > job->readVersion) { + if (maxVersion(n) > job->readVersion) { job->setResult(false); MUSTTAIL return complete(job, context); } @@ -3516,7 +3517,7 @@ FLATTEN PRESERVE_NONE void left_side_iter(CheckJob *job, if (job->remaining.size() == 0) { assert(job->searchPathLen >= job->prefixLen); - if (maxVersion(job->n) > job->readVersion) { + if (maxVersion(n) > job->readVersion) { *job->result = ConflictSet::Conflict; MUSTTAIL return complete(job, context); } else { @@ -3526,17 +3527,17 @@ FLATTEN PRESERVE_NONE void left_side_iter(CheckJob *job, } if (job->searchPathLen >= job->prefixLen) { - if (!checkMaxBetweenExclusive(job->n, job->remaining[0], 256, - job->readVersion, context->tls)) { + if (!checkMaxBetweenExclusive(n, job->remaining[0], 256, job->readVersion, + context->tls)) { *job->result = ConflictSet::Conflict; MUSTTAIL return complete(job, context); } } - auto c = getChild(job->n, job->remaining[0]); + auto c = getChild(n, job->remaining[0]); Node *child = c; if (child == nullptr) { - auto c = getChildGeq(job->n, job->remaining[0]); + auto c = getChildGeq(n, job->remaining[0]); if (c != nullptr) { if (job->searchPathLen < job->prefixLen) { job->n = c;