From 2764a049a8b838edf2558e16fe87b86afec42e83 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Thu, 23 May 2024 16:52:23 -0700 Subject: [PATCH] Merge two iterators approach for reverse case --- Facade.h | 50 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/Facade.h b/Facade.h index ce730dc..aaf1b00 100644 --- a/Facade.h +++ b/Facade.h @@ -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; } }