Facade: two iterator merge approach for forward case
This commit is contained in:
29
Facade.h
29
Facade.h
@@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user