Chromium Code Reviews| Index: chrome/browser/safe_browsing/prefix_set.cc |
| diff --git a/chrome/browser/safe_browsing/prefix_set.cc b/chrome/browser/safe_browsing/prefix_set.cc |
| index dae9578e322069d7e38ff30ac7a410ac10a1d777..fcb72d3ea13520b54412dd73b36349a961b692fa 100644 |
| --- a/chrome/browser/safe_browsing/prefix_set.cc |
| +++ b/chrome/browser/safe_browsing/prefix_set.cc |
| @@ -24,28 +24,26 @@ namespace safe_browsing { |
| PrefixSet::PrefixSet(const std::vector<SBPrefix>& prefixes) { |
|
lzheng
2011/03/03 22:30:07
Do you want to call "prefixes" "sorted_prefixes" t
|
| if (prefixes.size()) { |
| - std::vector<SBPrefix> sorted(prefixes.begin(), prefixes.end()); |
| - std::sort(sorted.begin(), sorted.end()); |
| - |
| // Lead with the first prefix. |
| - SBPrefix prev_prefix = sorted[0]; |
| + SBPrefix prev_prefix = prefixes[0]; |
| size_t run_length = 0; |
| index_.push_back(std::make_pair(prev_prefix, deltas_.size())); |
| - for (size_t i = 1; i < sorted.size(); ++i) { |
| - // Don't encode zero deltas. |
| - if (sorted[i] == prev_prefix) |
| + for (size_t i = 1; i < prefixes.size(); ++i) { |
| + // Skip duplicates. |
| + if (prefixes[i] == prev_prefix) |
| continue; |
| // Calculate the delta. |unsigned| is mandatory, because the |
| // prefixes could be more than INT_MAX apart. |
| - unsigned delta = sorted[i] - prev_prefix; |
| + DCHECK_GT(prefixes[i], prev_prefix); |
| + unsigned delta = prefixes[i] - prev_prefix; |
| // New index ref if the delta is too wide, or if too many |
| // consecutive deltas have been encoded. Note that |
| // |kMaxDelta| cannot itself be encoded. |
| if (delta >= kMaxDelta || run_length >= kMaxRun) { |
| - index_.push_back(std::make_pair(sorted[i], deltas_.size())); |
| + index_.push_back(std::make_pair(prefixes[i], deltas_.size())); |
| run_length = 0; |
| } else { |
| // Continue the run of deltas. |
| @@ -53,7 +51,7 @@ PrefixSet::PrefixSet(const std::vector<SBPrefix>& prefixes) { |
| ++run_length; |
| } |
| - prev_prefix = sorted[i]; |
| + prev_prefix = prefixes[i]; |
| } |
| // Send up some memory-usage stats. Bits because fractional bytes |
| @@ -103,4 +101,20 @@ bool PrefixSet::Exists(SBPrefix prefix) const { |
| return current == prefix; |
| } |
| +void PrefixSet::GetPrefixes(std::vector<SBPrefix>* prefixes) { |
| + for (size_t ii = 0; ii < index_.size(); ++ii) { |
| + // The deltas for this |index_| entry run to the next index entry, |
| + // or the end of the deltas. |
| + const size_t deltas_end = |
| + (ii + 1 < index_.size()) ? index_[ii + 1].second : deltas_.size(); |
| + |
| + SBPrefix current = index_[ii].first; |
| + prefixes->push_back(current); |
| + for (size_t di = index_[ii].second; di < deltas_end; ++di) { |
| + current += deltas_[di]; |
| + prefixes->push_back(current); |
| + } |
| + } |
| +} |
| + |
| } // namespace safe_browsing |