Merge two iterators approach for reverse case

This commit is contained in:
2024-05-23 16:52:23 -07:00
parent 5ff7ecc6fc
commit 2764a049a8

View File

@@ -52,8 +52,9 @@ struct Facade {
if (reverse) {
weaselab::VersionedMap::Iterator iter = versionedIter[1];
weaselab::VersionedMap::Iterator endIter = versionedIter[0];
String readUntil = end;
auto unversionedIter = facade->unversioned.lower_bound(end);
const auto beginIter = facade->unversioned.begin();
do {
--iter;
auto m = *iter;
@@ -62,7 +63,17 @@ struct Facade {
m.type == weaselab::VersionedMap::Set || m.param2Len == 0
? String(m.param1, m.param1Len) + zero
: String(m.param2, m.param2Len);
facade->unversionedRead(mEnd, readUntil, limit, true, result);
if (unversionedIter != beginIter) {
--unversionedIter;
for (; unversionedIter->first >= mEnd && limit > 0;
--unversionedIter) {
result.push_back(*unversionedIter);
--limit;
if (unversionedIter == beginIter) {
break;
}
}
}
if (limit == 0) {
return result;
}
@@ -73,15 +84,32 @@ struct Facade {
if (limit == 0) {
return result;
}
readUntil = mBegin;
} break;
case weaselab::VersionedMap::Clear:
readUntil = mBegin;
break;
}
if (m.type == weaselab::VersionedMap::Set || m.param2Len == 0) {
if (unversionedIter != facade->unversioned.end() &&
unversionedIter->first < mBegin) {
++unversionedIter;
}
assert(unversionedIter == facade->unversioned.lower_bound(mBegin));
} else {
unversionedIter = facade->unversioned.lower_bound(mBegin);
}
} while (iter != endIter);
facade->unversionedRead(begin, readUntil, limit, true, result);
if (unversionedIter != beginIter) {
--unversionedIter;
for (; unversionedIter->first >= begin && limit > 0;
--unversionedIter) {
result.push_back(*unversionedIter);
--limit;
if (unversionedIter == beginIter) {
break;
}
}
}
return result;
} else {
auto unversionedIter = facade->unversioned.lower_bound(begin);
@@ -205,16 +233,16 @@ struct Facade {
return;
}
if (reverse) {
auto iter = unversioned.lower_bound(end);
auto unversionedIter = unversioned.lower_bound(end);
const auto beginIter = unversioned.begin();
if (iter == beginIter) {
if (unversionedIter == beginIter) {
return;
}
--iter;
for (; iter->first >= begin && limit > 0; --iter) {
result.push_back(*iter);
--unversionedIter;
for (; unversionedIter->first >= begin && limit > 0; --unversionedIter) {
result.push_back(*unversionedIter);
--limit;
if (iter == beginIter) {
if (unversionedIter == beginIter) {
return;
}
}