| Index: chrome/common/extensions/url_pattern_set.cc
|
| diff --git a/chrome/common/extensions/url_pattern_set.cc b/chrome/common/extensions/url_pattern_set.cc
|
| index c84df1464f4127cd2fd07df154c147fb9fbc56b0..60f8e16b2b9dfae1007d0ded61d18edebb5a84ee 100644
|
| --- a/chrome/common/extensions/url_pattern_set.cc
|
| +++ b/chrome/common/extensions/url_pattern_set.cc
|
| @@ -8,6 +8,7 @@
|
| #include <iterator>
|
|
|
| #include "base/logging.h"
|
| +#include "base/memory/linked_ptr.h"
|
| #include "base/values.h"
|
| #include "chrome/common/extensions/extension_error_utils.h"
|
| #include "chrome/common/extensions/url_pattern.h"
|
| @@ -53,6 +54,39 @@ void URLPatternSet::CreateUnion(const URLPatternSet& set1,
|
| out->patterns_, out->patterns_.begin()));
|
| }
|
|
|
| +// static
|
| +void URLPatternSet::CreateUnion(const std::vector<URLPatternSet>& sets,
|
| + URLPatternSet* out) {
|
| + out->ClearPatterns();
|
| + if (sets.empty())
|
| + return;
|
| +
|
| + // N-way union algorithm is basic O(nlog(n)) merge algorithm.
|
| + //
|
| + // Do the first merge step into a working set so that we don't mutate any of
|
| + // the input.
|
| + std::vector<URLPatternSet> working;
|
| + for (size_t i = 0; i < sets.size(); i += 2) {
|
| + if (i + 1 < sets.size()) {
|
| + URLPatternSet u;
|
| + URLPatternSet::CreateUnion(sets[i], sets[i + 1], &u);
|
| + working.push_back(u);
|
| + } else {
|
| + working.push_back(sets[i]);
|
| + }
|
| + }
|
| +
|
| + for (size_t skip = 1; skip < working.size(); skip *= 2) {
|
| + for (size_t i = 0; i < (working.size() - skip); i += skip) {
|
| + URLPatternSet u;
|
| + URLPatternSet::CreateUnion(working[i], working[i + skip], &u);
|
| + working[i].patterns_.swap(u.patterns_);
|
| + }
|
| + }
|
| +
|
| + out->patterns_.swap(working[0].patterns_);
|
| +}
|
| +
|
| URLPatternSet::URLPatternSet() {}
|
|
|
| URLPatternSet::URLPatternSet(const URLPatternSet& rhs)
|
| @@ -76,6 +110,10 @@ bool URLPatternSet::is_empty() const {
|
| return patterns_.empty();
|
| }
|
|
|
| +size_t URLPatternSet::size() const {
|
| + return patterns_.size();
|
| +}
|
| +
|
| void URLPatternSet::AddPattern(const URLPattern& pattern) {
|
| patterns_.insert(pattern);
|
| }
|
|
|