Resume firstGeq search from within tree
This commit is contained in:
@@ -628,9 +628,6 @@ struct FirstGeqStepwise {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[[fallthrough]];
|
|
||||||
case Init:
|
|
||||||
phase = Search;
|
|
||||||
if (n->partialKeyLen > 0) {
|
if (n->partialKeyLen > 0) {
|
||||||
int commonLen = std::min<int>(n->partialKeyLen, remaining.size());
|
int commonLen = std::min<int>(n->partialKeyLen, remaining.size());
|
||||||
for (int i = 0; i < commonLen; ++i) {
|
for (int i = 0; i < commonLen; ++i) {
|
||||||
@@ -655,6 +652,9 @@ struct FirstGeqStepwise {
|
|||||||
return downLeftSpine();
|
return downLeftSpine();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[[fallthrough]];
|
||||||
|
case Init:
|
||||||
|
phase = Search;
|
||||||
if (remaining.size() == 0 && n->entryPresent) {
|
if (remaining.size() == 0 && n->entryPresent) {
|
||||||
cmp = 0;
|
cmp = 0;
|
||||||
return true;
|
return true;
|
||||||
@@ -954,7 +954,16 @@ bool checkRangeRead(Node *n, const std::span<const uint8_t> begin,
|
|||||||
begin.subspan(0, lcp - search.remaining.size()) ==
|
begin.subspan(0, lcp - search.remaining.size()) ==
|
||||||
0);
|
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)
|
#if DEBUG_VERBOSE && !defined(NDEBUG)
|
||||||
fprintf(stderr, "firstGeq for `%s' got `%s'\n", printable(begin).c_str(),
|
fprintf(stderr, "firstGeq for `%s' got `%s'\n", printable(begin).c_str(),
|
||||||
|
Reference in New Issue
Block a user