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