Avoid some copies in Facade

This commit is contained in:
2024-05-15 13:53:05 -07:00
parent 63fdc5e4f5
commit 75d5e811de

View File

@@ -38,16 +38,14 @@ 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);
auto remaining = facade->unversionedRead(mEnd, readUntil, limit, true, result);
facade->unversionedRead(mEnd, readUntil, limit, true);
result.insert(result.end(), remaining.begin(), remaining.end());
if (limit == 0) { if (limit == 0) {
return result; return result;
} }
switch (m.type) { switch (m.type) {
case weaselab::VersionedMap::Set: { case weaselab::VersionedMap::Set: {
result.push_back( result.emplace_back(String(m.param1, m.param1Len),
{String(m.param1, m.param1Len), String(m.param2, m.param2Len)}); String(m.param2, m.param2Len));
--limit; --limit;
if (limit == 0) { if (limit == 0) {
return result; return result;
@@ -59,8 +57,7 @@ struct Facade {
break; break;
} }
} }
auto remaining = facade->unversionedRead(begin, readUntil, limit, true); facade->unversionedRead(begin, readUntil, limit, true, result);
result.insert(result.end(), remaining.begin(), remaining.end());
return result; return result;
} else { } else {
weaselab::VersionedMap::Iterator iter = versionedIter[0]; weaselab::VersionedMap::Iterator iter = versionedIter[0];
@@ -69,15 +66,13 @@ struct Facade {
for (; iter != endIter; ++iter) { for (; iter != endIter; ++iter) {
auto m = *iter; auto m = *iter;
const auto mBegin = String(m.param1, m.param1Len); const auto mBegin = String(m.param1, m.param1Len);
auto remaining = facade->unversionedRead(readThrough, mBegin, limit, false, result);
facade->unversionedRead(readThrough, mBegin, limit, false);
result.insert(result.end(), remaining.begin(), remaining.end());
if (limit == 0) { if (limit == 0) {
return result; return result;
} }
switch (m.type) { switch (m.type) {
case weaselab::VersionedMap::Set: { case weaselab::VersionedMap::Set: {
result.push_back({mBegin, String(m.param2, m.param2Len)}); result.emplace_back(mBegin, String(m.param2, m.param2Len));
--limit; --limit;
if (limit == 0) { if (limit == 0) {
return result; return result;
@@ -89,9 +84,7 @@ struct Facade {
break; break;
} }
} }
auto remaining = facade->unversionedRead(readThrough, end, limit, false, result);
facade->unversionedRead(readThrough, end, limit, false);
result.insert(result.end(), remaining.begin(), remaining.end());
return result; return result;
} }
} }
@@ -138,29 +131,27 @@ struct Facade {
int64_t getVersion() const { return versioned.getVersion(); } int64_t getVersion() const { return versioned.getVersion(); }
int64_t getOldestVersion() const { return versioned.getOldestVersion(); } int64_t getOldestVersion() const { return versioned.getOldestVersion(); }
std::vector<std::pair<String, String>> unversionedRead(const String &begin, void unversionedRead(const String &begin, const String &end, int &limit,
const String &end, bool reverse,
int &limit, std::vector<std::pair<String, String>> &result) const {
bool reverse) const {
if (begin >= end) { if (begin >= end) {
return {}; return;
} }
std::vector<std::pair<String, String>> result;
if (reverse) { if (reverse) {
if (unversioned.empty()) { if (unversioned.empty()) {
return result; return;
} }
auto iter = unversioned.lower_bound(end); auto iter = unversioned.lower_bound(end);
const auto beginIter = unversioned.begin(); const auto beginIter = unversioned.begin();
if (iter == beginIter) { if (iter == beginIter) {
return result; return;
} }
--iter; --iter;
for (; iter->first >= begin && limit > 0; --iter) { for (; iter->first >= begin && limit > 0; --iter) {
result.push_back(*iter); result.push_back(*iter);
--limit; --limit;
if (iter == beginIter) { if (iter == beginIter) {
return result; return;
} }
} }
} else { } else {
@@ -171,7 +162,6 @@ struct Facade {
--limit; --limit;
} }
} }
return result;
} }
std::map<String, String> unversioned; std::map<String, String> unversioned;