From 961fb180666953920cbce8047c72f0a0ac2a99eb Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Tue, 13 Feb 2024 12:08:13 -0800 Subject: [PATCH] Resume firstGeq search from within tree --- ConflictSet.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 35ba0db..11a00db 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -628,9 +628,6 @@ struct FirstGeqStepwise { } } } - [[fallthrough]]; - case Init: - phase = Search; if (n->partialKeyLen > 0) { int commonLen = std::min(n->partialKeyLen, remaining.size()); for (int i = 0; i < commonLen; ++i) { @@ -655,6 +652,9 @@ struct FirstGeqStepwise { return downLeftSpine(); } } + [[fallthrough]]; + case Init: + phase = Search; if (remaining.size() == 0 && n->entryPresent) { cmp = 0; return true; @@ -954,7 +954,16 @@ bool checkRangeRead(Node *n, const std::span begin, begin.subspan(0, lcp - search.remaining.size()) == 0); - auto left = firstGeq(n, begin); + // Check that we can start FirstGeq where Search left off + int consumed = lcp - search.remaining.size(); + assert(consumed >= 0); + auto left = + firstGeq(search.n, begin.subspan(consumed, int(begin.size()) - consumed)); +#ifndef NDEBUG + auto iter = firstGeq(n, begin); + assert(left.cmp == iter.cmp); + assert(left.n == iter.n); +#endif #if DEBUG_VERBOSE && !defined(NDEBUG) fprintf(stderr, "firstGeq for `%s' got `%s'\n", printable(begin).c_str(),