diff options
author | paulg@google.com <paulg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-08 02:14:08 +0000 |
---|---|---|
committer | paulg@google.com <paulg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-08 02:14:08 +0000 |
commit | 4f24e87d4c051571744bab377cc356bdef093701 (patch) | |
tree | 7da8e990e10f95aabf6cf73670971bc654e3c214 /chrome/browser/safe_browsing | |
parent | 6bf766924e2e8dc08ccd248bc128bd6fe29297cd (diff) | |
download | chromium_src-4f24e87d4c051571744bab377cc356bdef093701.zip chromium_src-4f24e87d4c051571744bab377cc356bdef093701.tar.gz chromium_src-4f24e87d4c051571744bab377cc356bdef093701.tar.bz2 |
Make chunk ranges searchable.
Review URL: http://codereview.chromium.org/5645
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@2990 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/safe_browsing')
-rw-r--r-- | chrome/browser/safe_browsing/chunk_range.cc | 26 | ||||
-rw-r--r-- | chrome/browser/safe_browsing/chunk_range.h | 2 | ||||
-rw-r--r-- | chrome/browser/safe_browsing/chunk_range_unittest.cc | 19 |
3 files changed, 47 insertions, 0 deletions
diff --git a/chrome/browser/safe_browsing/chunk_range.cc b/chrome/browser/safe_browsing/chunk_range.cc index e40ee72..0781e45 100644 --- a/chrome/browser/safe_browsing/chunk_range.cc +++ b/chrome/browser/safe_browsing/chunk_range.cc @@ -94,3 +94,29 @@ bool StringToRanges(const std::string& input, return true; } + +// Binary search over a series of ChunkRanges. +bool IsChunkInRange(int chunk_number, const std::vector<ChunkRange>& ranges) { + if (ranges.empty()) + return false; + + int low = 0; + int high = ranges.size() - 1; + + while (low <= high) { + // http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html + int mid = ((unsigned int)low + (unsigned int)high) >> 1; + const ChunkRange& chunk = ranges[mid]; + if ((chunk.stop() >= chunk_number) && (chunk.start() <= chunk_number)) + return true; // chunk_number is in range. + + // Adjust our mid point. + if (chunk.stop() < chunk_number) + low = mid + 1; + else + high = mid - 1; + } + + return false; +} + diff --git a/chrome/browser/safe_browsing/chunk_range.h b/chrome/browser/safe_browsing/chunk_range.h index d547dea..a9969b1 100644 --- a/chrome/browser/safe_browsing/chunk_range.h +++ b/chrome/browser/safe_browsing/chunk_range.h @@ -60,5 +60,7 @@ void RangesToString(const std::vector<ChunkRange>& ranges, bool StringToRanges(const std::string& input, std::vector<ChunkRange>* ranges); +// Tests if a chunk number is contained a sorted vector of ChunkRanges. +bool IsChunkInRange(int chunk_number, const std::vector<ChunkRange>& ranges); #endif // CHROME_BROWSER_SAFE_BROWSING_CHUNK_RANGE_H_ diff --git a/chrome/browser/safe_browsing/chunk_range_unittest.cc b/chrome/browser/safe_browsing/chunk_range_unittest.cc index e467dfd..91e44db 100644 --- a/chrome/browser/safe_browsing/chunk_range_unittest.cc +++ b/chrome/browser/safe_browsing/chunk_range_unittest.cc @@ -175,3 +175,22 @@ TEST(SafeBrowsingChunkRangeTest, TestRangesToChunks) { EXPECT_EQ(chunks[3], 4); EXPECT_EQ(chunks[4], 17); } + + +TEST(SafeBrowsingChunkRangeTest, TestSearchChunkRanges) { + std::string range_str("1-10,15-17,21-410,555,991-1000"); + std::vector<ChunkRange> ranges; + StringToRanges(range_str, &ranges); + + EXPECT_TRUE(IsChunkInRange(7, ranges)); + EXPECT_TRUE(IsChunkInRange(300, ranges)); + EXPECT_TRUE(IsChunkInRange(555, ranges)); + EXPECT_TRUE(IsChunkInRange(1, ranges)); + EXPECT_TRUE(IsChunkInRange(1000, ranges)); + + EXPECT_FALSE(IsChunkInRange(11, ranges)); + EXPECT_FALSE(IsChunkInRange(990, ranges)); + EXPECT_FALSE(IsChunkInRange(2000, ranges)); +} + + |