Facade: two iterator merge approach for forward case

This commit is contained in:
2024-05-23 16:25:29 -07:00
parent 5b4c7ddf7d
commit 5ff7ecc6fc

View File

@@ -84,8 +84,7 @@ struct Facade {
facade->unversionedRead(begin, readUntil, limit, true, result);
return result;
} else {
String readFrom = begin;
auto unversionedIter = facade->unversioned.lower_bound(begin);
for (auto iter = versionedIter[0]; iter != versionedIter[1]; ++iter) {
auto m = *iter;
const auto mBegin = String(m.param1, m.param1Len);
@@ -93,7 +92,14 @@ struct Facade {
m.type == weaselab::VersionedMap::Set || m.param2Len == 0
? String(m.param1, m.param1Len) + zero
: String(m.param2, m.param2Len);
facade->unversionedRead(readFrom, mBegin, limit, false, result);
auto c = unversionedIter->first <=> mBegin;
for (; unversionedIter != facade->unversioned.end() && c < 0 &&
limit > 0;) {
result.push_back(*unversionedIter);
--limit;
++unversionedIter;
c = unversionedIter->first <=> mBegin;
}
if (limit == 0) {
return result;
}
@@ -104,15 +110,26 @@ struct Facade {
if (limit == 0) {
return result;
}
readFrom = mEnd;
} break;
case weaselab::VersionedMap::Clear:
readFrom = mEnd;
break;
}
if (m.type == weaselab::VersionedMap::Set || m.param2Len == 0) {
if (unversionedIter != facade->unversioned.end() && c == 0) {
++unversionedIter;
}
assert(unversionedIter == facade->unversioned.lower_bound(mEnd));
} else {
unversionedIter = facade->unversioned.lower_bound(mEnd);
}
}
facade->unversionedRead(readFrom, end, limit, false, result);
for (; unversionedIter != facade->unversioned.end() &&
unversionedIter->first < end && limit > 0;
++unversionedIter) {
result.push_back(*unversionedIter);
--limit;
}
return result;
}
}