void testVarint(uint64_t val, std::initializer_list<uint8_t> bytes) { size_t n = bytes.size(); ByteRange expected(&*bytes.begin(), n); { uint8_t buf[kMaxVarintLength64]; EXPECT_EQ(expected.size(), encodeVarint(val, buf)); EXPECT_TRUE(ByteRange(buf, expected.size()) == expected); } { ByteRange r = expected; uint64_t decoded = decodeVarint(r); EXPECT_TRUE(r.empty()); EXPECT_EQ(val, decoded); } if (n < kMaxVarintLength64) { // Try from a full buffer too, different code path uint8_t buf[kMaxVarintLength64]; memcpy(buf, &*bytes.begin(), n); uint8_t fills[] = {0, 0x7f, 0x80, 0xff}; for (uint8_t fill : fills) { memset(buf + n, fill, kMaxVarintLength64 - n); ByteRange r(buf, kMaxVarintLength64); uint64_t decoded = decodeVarint(r); EXPECT_EQ(val, decoded); EXPECT_EQ(kMaxVarintLength64 - n, r.size()); } } }
void RecordIOReader::Iterator::advanceToValid() { ByteRange record = findRecord(range_, fileId_).record; if (record.empty()) { recordAndPos_ = std::make_pair(ByteRange(), off_t(-1)); range_.clear(); // at end } else { size_t skipped = record.begin() - range_.begin(); DCHECK_GE(skipped, headerSize()); skipped -= headerSize(); range_.advance(skipped); recordAndPos_.first = record; recordAndPos_.second += skipped; } }