diff --git a/Facade.h b/Facade.h index 4f8c719..ce730dc 100644 --- a/Facade.h +++ b/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; } }