Maintain nextSib in firstGeq
This is slower, but I think it's closer to what we want for our eventual bespoke "fused-check-and-search" implementation.
This commit is contained in:
@@ -657,6 +657,7 @@ std::string getSearchPath(Node *n) {
|
|||||||
|
|
||||||
Iterator firstGeq(Node *n, const std::span<const uint8_t> key) {
|
Iterator firstGeq(Node *n, const std::span<const uint8_t> key) {
|
||||||
auto remaining = key;
|
auto remaining = key;
|
||||||
|
Node *nextSib = nullptr;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
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());
|
||||||
@@ -668,7 +669,7 @@ Iterator firstGeq(Node *n, const std::span<const uint8_t> key) {
|
|||||||
if (c > 0) {
|
if (c > 0) {
|
||||||
goto downLeftSpine;
|
goto downLeftSpine;
|
||||||
} else {
|
} else {
|
||||||
n = nextSibling(n);
|
n = nextSib;
|
||||||
goto downLeftSpine;
|
goto downLeftSpine;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -691,6 +692,10 @@ Iterator firstGeq(Node *n, const std::span<const uint8_t> key) {
|
|||||||
goto downLeftSpine;
|
goto downLeftSpine;
|
||||||
} else {
|
} else {
|
||||||
int c = getChildGeq(n, remaining[0]);
|
int c = getChildGeq(n, remaining[0]);
|
||||||
|
int c2 = getChildGeq(n, int(remaining[0]) + 1);
|
||||||
|
if (c2 >= 0) {
|
||||||
|
nextSib = getChildExists(n, c2);
|
||||||
|
}
|
||||||
if (c == remaining[0]) {
|
if (c == remaining[0]) {
|
||||||
n = getChildExists(n, c);
|
n = getChildExists(n, c);
|
||||||
remaining = remaining.subspan(1, remaining.size() - 1);
|
remaining = remaining.subspan(1, remaining.size() - 1);
|
||||||
@@ -699,7 +704,7 @@ Iterator firstGeq(Node *n, const std::span<const uint8_t> key) {
|
|||||||
n = getChildExists(n, c);
|
n = getChildExists(n, c);
|
||||||
goto downLeftSpine;
|
goto downLeftSpine;
|
||||||
} else {
|
} else {
|
||||||
n = nextSibling(n);
|
n = nextSib;
|
||||||
goto downLeftSpine;
|
goto downLeftSpine;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user