1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/content_settings/core/browser/content_settings_rule.h"
6 
7 #include <utility>
8 
9 #include "base/logging.h"
10 
11 namespace content_settings {
12 
13 Rule::Rule() = default;
14 
Rule(const ContentSettingsPattern & primary_pattern,const ContentSettingsPattern & secondary_pattern,base::Value value)15 Rule::Rule(const ContentSettingsPattern& primary_pattern,
16            const ContentSettingsPattern& secondary_pattern,
17            base::Value value)
18     : primary_pattern(primary_pattern),
19       secondary_pattern(secondary_pattern),
20       value(std::move(value)) {}
21 
22 Rule::Rule(Rule&& other) = default;
23 
24 Rule& Rule::operator=(Rule&& other) = default;
25 
26 Rule::~Rule() = default;
27 
28 RuleIterator::~RuleIterator() = default;
29 
ConcatenationIterator(std::vector<std::unique_ptr<RuleIterator>> iterators,base::AutoLock * auto_lock)30 ConcatenationIterator::ConcatenationIterator(
31     std::vector<std::unique_ptr<RuleIterator>> iterators,
32     base::AutoLock* auto_lock)
33     : iterators_(std::move(iterators)), auto_lock_(auto_lock) {
34   auto it = iterators_.begin();
35   while (it != iterators_.end()) {
36     if (!(*it)->HasNext())
37       it = iterators_.erase(it);
38     else
39       ++it;
40   }
41 }
42 
43 ConcatenationIterator::~ConcatenationIterator() = default;
44 
HasNext() const45 bool ConcatenationIterator::HasNext() const {
46   return !iterators_.empty();
47 }
48 
Next()49 Rule ConcatenationIterator::Next() {
50   auto current_iterator = iterators_.begin();
51   DCHECK(current_iterator != iterators_.end());
52   DCHECK((*current_iterator)->HasNext());
53   const Rule& next_rule = (*current_iterator)->Next();
54   Rule to_return(next_rule.primary_pattern, next_rule.secondary_pattern,
55                  next_rule.value.Clone());
56   if (!(*current_iterator)->HasNext())
57     iterators_.erase(current_iterator);
58   return to_return;
59 }
60 
61 }  // namespace content_settings
62