diff --git a/Facade.h b/Facade.h index ee89ab1..442e767 100644 --- a/Facade.h +++ b/Facade.h @@ -25,16 +25,19 @@ struct Facade { const int64_t v[] = {version, version}; facade->versioned.firstGeq(key, v, versionedIter, 2); - const uint8_t zero[] = {0}; + static const uint8_t zero_[] = {0}; + static const String zero{zero_, 1}; + if (reverse) { weaselab::VersionedMap::Iterator iter = versionedIter[1]; weaselab::VersionedMap::Iterator endIter = versionedIter[0]; String readUntil = end; for (; iter != endIter; --iter) { auto m = *iter; - auto mEnd = m.type == weaselab::VersionedMap::Set - ? String(m.param1, m.param1Len) + String(zero, 1) - : String(m.param2, m.param2Len); + const auto mEnd = + m.type == weaselab::VersionedMap::Set || m.param2Len == 0 + ? String(m.param1, m.param1Len) + zero + : String(m.param2, m.param2Len); auto remaining = facade->unversionedRead(mEnd, readUntil, limit, true); result.insert(result.end(), remaining.begin(), remaining.end()); @@ -65,22 +68,21 @@ struct Facade { String readThrough = begin; for (; iter != endIter; ++iter) { auto m = *iter; - auto remaining = facade->unversionedRead( - readThrough, String(m.param1, m.param1Len), limit, false); + const auto mBegin = String(m.param1, m.param1Len); + auto remaining = + facade->unversionedRead(readThrough, mBegin, limit, false); result.insert(result.end(), remaining.begin(), remaining.end()); if (limit == 0) { return result; } switch (m.type) { case weaselab::VersionedMap::Set: { - result.push_back( - {String(m.param1, m.param1Len), String(m.param2, m.param2Len)}); + result.push_back({mBegin, String(m.param2, m.param2Len)}); --limit; if (limit == 0) { return result; } - uint8_t zero[] = {0}; - readThrough = String(m.param1, m.param1Len) + String(zero, 1); + readThrough = mBegin + zero; } break; case weaselab::VersionedMap::Clear: readThrough = String(m.param2, m.param2Len); @@ -140,15 +142,26 @@ struct Facade { const String &end, int &limit, bool reverse) const { + if (begin >= end) { + return {}; + } std::vector> result; if (reverse) { if (unversioned.empty()) { return result; } - for (auto iter = --unversioned.lower_bound(end); - iter->first >= begin && limit > 0; --iter) { + auto iter = unversioned.lower_bound(end); + const auto beginIter = unversioned.begin(); + if (iter == beginIter) { + return result; + } + --iter; + for (; iter->first >= begin && limit > 0; --iter) { result.push_back(*iter); --limit; + if (iter == beginIter) { + return result; + } } } else { for (auto iter = unversioned.lower_bound(begin),