Avoid copies in Facade

This commit is contained in:
2024-05-23 17:27:55 -07:00
parent 2764a049a8
commit b5dbf4a049
3 changed files with 48 additions and 15 deletions

View File

@@ -1,14 +1,12 @@
#pragma once
#include "KeyCompare.h"
#include "VersionedMap.h"
#include <assert.h>
#include <map>
#include <string>
#include <vector>
using String = std::basic_string<uint8_t>;
struct Facade {
explicit Facade(int64_t version)
@@ -58,11 +56,12 @@ struct Facade {
do {
--iter;
auto m = *iter;
const auto mBegin = String(m.param1, m.param1Len);
const auto mBegin =
weaselab::VersionedMap::Key{m.param1, m.param1Len};
const auto mEnd =
m.type == weaselab::VersionedMap::Set || m.param2Len == 0
? String(m.param1, m.param1Len) + zero
: String(m.param2, m.param2Len);
? weaselab::VersionedMap::Key{m.param1, m.param1Len + 1}
: weaselab::VersionedMap::Key{m.param2, m.param2Len};
if (unversionedIter != beginIter) {
--unversionedIter;
for (; unversionedIter->first >= mEnd && limit > 0;
@@ -79,7 +78,8 @@ struct Facade {
}
switch (m.type) {
case weaselab::VersionedMap::Set: {
result.emplace_back(mBegin, String(m.param2, m.param2Len));
result.emplace_back(String(mBegin.p, mBegin.len),
String(m.param2, m.param2Len));
--limit;
if (limit == 0) {
return result;
@@ -93,9 +93,11 @@ struct Facade {
unversionedIter->first < mBegin) {
++unversionedIter;
}
assert(unversionedIter == facade->unversioned.lower_bound(mBegin));
assert(unversionedIter == facade->unversioned.lower_bound(
String(mBegin.p, mBegin.len)));
} else {
unversionedIter = facade->unversioned.lower_bound(mBegin);
unversionedIter =
facade->unversioned.lower_bound(String(mBegin.p, mBegin.len));
}
} while (iter != endIter);
@@ -115,11 +117,12 @@ struct Facade {
auto unversionedIter = facade->unversioned.lower_bound(begin);
for (auto iter = versionedIter[0]; iter != versionedIter[1]; ++iter) {
auto m = *iter;
const auto mBegin = String(m.param1, m.param1Len);
const auto mBegin =
weaselab::VersionedMap::Key{m.param1, m.param1Len};
const auto mEnd =
m.type == weaselab::VersionedMap::Set || m.param2Len == 0
? String(m.param1, m.param1Len) + zero
: String(m.param2, m.param2Len);
? weaselab::VersionedMap::Key{m.param1, m.param1Len + 1}
: weaselab::VersionedMap::Key{m.param2, m.param2Len};
auto c = unversionedIter->first <=> mBegin;
for (; unversionedIter != facade->unversioned.end() && c < 0 &&
limit > 0;) {
@@ -133,7 +136,8 @@ struct Facade {
}
switch (m.type) {
case weaselab::VersionedMap::Set: {
result.emplace_back(mBegin, String(m.param2, m.param2Len));
result.emplace_back(String(mBegin.p, mBegin.len),
String(m.param2, m.param2Len));
--limit;
if (limit == 0) {
return result;
@@ -146,9 +150,11 @@ struct Facade {
if (unversionedIter != facade->unversioned.end() && c == 0) {
++unversionedIter;
}
assert(unversionedIter == facade->unversioned.lower_bound(mEnd));
assert(unversionedIter ==
facade->unversioned.lower_bound(String(mEnd.p, mEnd.len)));
} else {
unversionedIter = facade->unversioned.lower_bound(mEnd);
unversionedIter =
facade->unversioned.lower_bound(String(mEnd.p, mEnd.len));
}
}