Change the internal representation in RangeSet.

This CL makes the following changes to RangeSet:
 - Uses std::pair<size_t, size_t> to represent a Range;
 - Uses std::vector<Range> to represent a RangeSet;
 - Provides const iterators (forward and reverse);
 - Provides const accessor;
 - 'blocks()' returns the number of blocks (formerly 'size');
 - 'size()' returns the number of Range's (formerly 'count').

Test: recovery_unit_test
Test: Apply an incremental update with the new updater.
Change-Id: Ia1fbb343370a152e1f7aa050cf914c2da09b1396
This commit is contained in:
Tao Bao
2017-03-30 16:57:29 -07:00
parent b6609f8895
commit bf5b77dbf7
3 changed files with 328 additions and 249 deletions
+34 -6
View File
@@ -25,14 +25,15 @@
TEST(RangeSetTest, Parse_smoke) {
RangeSet rs = RangeSet::Parse("2,1,10");
ASSERT_EQ(static_cast<size_t>(1), rs.count);
ASSERT_EQ((std::vector<size_t>{ 1, 10 }), rs.pos);
ASSERT_EQ(static_cast<size_t>(9), rs.size);
ASSERT_EQ(static_cast<size_t>(1), rs.size());
ASSERT_EQ((Range{ 1, 10 }), rs[0]);
ASSERT_EQ(static_cast<size_t>(9), rs.blocks());
RangeSet rs2 = RangeSet::Parse("4,15,20,1,10");
ASSERT_EQ(static_cast<size_t>(2), rs2.count);
ASSERT_EQ((std::vector<size_t>{ 15, 20, 1, 10 }), rs2.pos);
ASSERT_EQ(static_cast<size_t>(14), rs2.size);
ASSERT_EQ(static_cast<size_t>(2), rs2.size());
ASSERT_EQ((Range{ 15, 20 }), rs2[0]);
ASSERT_EQ((Range{ 1, 10 }), rs2[1]);
ASSERT_EQ(static_cast<size_t>(14), rs2.blocks());
// Leading zeros are fine. But android::base::ParseUint() doesn't like trailing zeros like "10 ".
ASSERT_EQ(rs, RangeSet::Parse(" 2, 1, 10"));
@@ -82,3 +83,30 @@ TEST(RangeSetTest, GetBlockNumber) {
// Out of bound.
ASSERT_EXIT(rs.GetBlockNumber(9), ::testing::KilledBySignal(SIGABRT), "");
}
TEST(RangeSetTest, equality) {
ASSERT_EQ(RangeSet::Parse("2,1,6"), RangeSet::Parse("2,1,6"));
ASSERT_NE(RangeSet::Parse("2,1,6"), RangeSet::Parse("2,1,7"));
ASSERT_NE(RangeSet::Parse("2,1,6"), RangeSet::Parse("2,2,7"));
// The orders of Range's matter. "4,1,5,8,10" != "4,8,10,1,5".
ASSERT_NE(RangeSet::Parse("4,1,5,8,10"), RangeSet::Parse("4,8,10,1,5"));
}
TEST(RangeSetTest, iterators) {
RangeSet rs = RangeSet::Parse("4,1,5,8,10");
std::vector<Range> ranges;
for (const auto& range : rs) {
ranges.push_back(range);
}
ASSERT_EQ((std::vector<Range>{ Range{ 1, 5 }, Range{ 8, 10 } }), ranges);
ranges.clear();
// Reverse iterators.
for (auto it = rs.crbegin(); it != rs.crend(); it++) {
ranges.push_back(*it);
}
ASSERT_EQ((std::vector<Range>{ Range{ 8, 10 }, Range{ 1, 5 } }), ranges);
}