Add efficient firstGeq overload for latestVersion
This commit is contained in:
@@ -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();
|
||||
|
Reference in New Issue
Block a user