Add efficient firstGeq overload for latestVersion

This commit is contained in:
2024-06-03 22:28:01 -07:00
parent ba11412584
commit b92f0ec227
5 changed files with 168 additions and 73 deletions

View File

@@ -1416,6 +1416,35 @@ void VersionedMap::firstGeq(const Key *key, const int64_t *version,
}
}
void VersionedMap::firstGeq(const Key *key, Iterator *iterator,
int count) const {
for (int i = 0; i < count; i++) {
if (iterator[i].impl != nullptr) {
iterator[i].impl->~Impl();
new (iterator[i].impl) Iterator::Impl();
} else {
// TODO re-use root if version if matches
iterator[i].impl =
new (safe_malloc(sizeof(Iterator::Impl))) Iterator::Impl();
}
auto view = impl->versionedData.atLatest();
iterator[i].impl->iter = view.lastLessOrEqual(key[i]);
// Increment if the mutation is < key[i], and doesn't intersect it
if (iterator[i].impl->iter) {
if (iterator[i].impl->iter->isValue() &&
iterator[i].impl->iter.key() < key[i]) {
++iterator[i].impl->iter;
} else if (iterator[i].impl->iter->isClearTo() &&
iterator[i].impl->iter->getEndKey() <= key[i]) {
++iterator[i].impl->iter;
}
} else {
iterator[i].impl->iter = view.begin();
}
}
}
VersionedMap::Iterator VersionedMap::begin(int64_t version) const {
Iterator result;
result.impl = new (safe_malloc(sizeof(Iterator::Impl))) Iterator::Impl();