Avoid copies in Facade
This commit is contained in:
36
Facade.h
36
Facade.h
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user