From 45cc598b220e37a494a522328c39d1a1ba41b18a Mon Sep 17 00:00:00 2001 From: Doug Hoyte Date: Sun, 5 Mar 2023 23:37:47 -0500 Subject: [PATCH] wip --- src/xor.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/xor.h b/src/xor.h index 00d6735..8f5a3c0 100644 --- a/src/xor.h +++ b/src/xor.h @@ -58,9 +58,7 @@ struct XorView { void finalise() { std::reverse(elems.begin(), elems.end()); // typically pushed in approximately descending order so this may speed up the sort - std::sort(elems.begin(), elems.end()); - ready = true; } @@ -77,11 +75,12 @@ struct XorView { if (!ready) throw herr("xor view not ready"); std::string output; + auto prevUpper = elems.begin(); while (query.size()) { uint64_t lowerTimestamp = decodeVarInt(query); uint64_t lowerLength = decodeVarInt(query); - if (lowerLength > idSize) throw herr("lower too long: ", lowerLength); + if (lowerLength > idSize) throw herr("lower too long"); auto lowerKeyRaw = getBytes(query, lowerLength); XorElem lowerKey(lowerTimestamp, lowerKeyRaw); @@ -91,8 +90,9 @@ struct XorView { auto upperKeyRaw = getBytes(query, upperLength); XorElem upperKey(upperTimestamp, upperKeyRaw); - auto lower = std::lower_bound(elems.begin(), elems.end(), lowerKey); // FIXME: start at prev upper? - auto upper = std::upper_bound(elems.begin(), elems.end(), upperKey); // FIXME: start at lower? + auto lower = std::lower_bound(prevUpper, elems.end(), lowerKey); + auto upper = std::upper_bound(lower, elems.end(), upperKey); + prevUpper = upper; uint64_t mode = decodeVarInt(query); // 0 = range, 8 and above = n-8 inline IDs