Merge two iterators approach for reverse case
This commit is contained in:
50
Facade.h
50
Facade.h
@@ -52,8 +52,9 @@ struct Facade {
|
|||||||
if (reverse) {
|
if (reverse) {
|
||||||
weaselab::VersionedMap::Iterator iter = versionedIter[1];
|
weaselab::VersionedMap::Iterator iter = versionedIter[1];
|
||||||
weaselab::VersionedMap::Iterator endIter = versionedIter[0];
|
weaselab::VersionedMap::Iterator endIter = versionedIter[0];
|
||||||
String readUntil = end;
|
auto unversionedIter = facade->unversioned.lower_bound(end);
|
||||||
|
|
||||||
|
const auto beginIter = facade->unversioned.begin();
|
||||||
do {
|
do {
|
||||||
--iter;
|
--iter;
|
||||||
auto m = *iter;
|
auto m = *iter;
|
||||||
@@ -62,7 +63,17 @@ struct Facade {
|
|||||||
m.type == weaselab::VersionedMap::Set || m.param2Len == 0
|
m.type == weaselab::VersionedMap::Set || m.param2Len == 0
|
||||||
? String(m.param1, m.param1Len) + zero
|
? String(m.param1, m.param1Len) + zero
|
||||||
: String(m.param2, m.param2Len);
|
: 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) {
|
if (limit == 0) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -73,15 +84,32 @@ struct Facade {
|
|||||||
if (limit == 0) {
|
if (limit == 0) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
readUntil = mBegin;
|
|
||||||
} break;
|
} break;
|
||||||
case weaselab::VersionedMap::Clear:
|
case weaselab::VersionedMap::Clear:
|
||||||
readUntil = mBegin;
|
|
||||||
break;
|
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);
|
} 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;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
auto unversionedIter = facade->unversioned.lower_bound(begin);
|
auto unversionedIter = facade->unversioned.lower_bound(begin);
|
||||||
@@ -205,16 +233,16 @@ struct Facade {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (reverse) {
|
if (reverse) {
|
||||||
auto iter = unversioned.lower_bound(end);
|
auto unversionedIter = unversioned.lower_bound(end);
|
||||||
const auto beginIter = unversioned.begin();
|
const auto beginIter = unversioned.begin();
|
||||||
if (iter == beginIter) {
|
if (unversionedIter == beginIter) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
--iter;
|
--unversionedIter;
|
||||||
for (; iter->first >= begin && limit > 0; --iter) {
|
for (; unversionedIter->first >= begin && limit > 0; --unversionedIter) {
|
||||||
result.push_back(*iter);
|
result.push_back(*unversionedIter);
|
||||||
--limit;
|
--limit;
|
||||||
if (iter == beginIter) {
|
if (unversionedIter == beginIter) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user