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