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 "base/logging.h"
6#include "components/content_settings/core/browser/content_settings_rule.h"
7
8namespace content_settings {
9
10Rule::Rule() {}
11
12Rule::Rule(
13    const ContentSettingsPattern& primary_pattern,
14    const ContentSettingsPattern& secondary_pattern,
15    base::Value* value)
16    : primary_pattern(primary_pattern),
17      secondary_pattern(secondary_pattern),
18      value(value) {
19  DCHECK(value);
20}
21
22Rule::~Rule() {}
23
24RuleIterator::~RuleIterator() {}
25
26EmptyRuleIterator::~EmptyRuleIterator() {}
27
28bool EmptyRuleIterator::HasNext() const {
29  return false;
30}
31
32Rule EmptyRuleIterator::Next() {
33  NOTREACHED();
34  return Rule();
35}
36
37ConcatenationIterator::ConcatenationIterator(
38    ScopedVector<RuleIterator>* iterators,
39    base::AutoLock* auto_lock)
40    : auto_lock_(auto_lock) {
41  iterators_.swap(*iterators);
42
43  ScopedVector<RuleIterator>::iterator it = iterators_.begin();
44  while (it != iterators_.end()) {
45    if (!(*it)->HasNext())
46      it = iterators_.erase(it);
47    else
48      ++it;
49  }
50}
51
52ConcatenationIterator::~ConcatenationIterator() {}
53
54bool ConcatenationIterator::HasNext() const {
55  return (!iterators_.empty());
56}
57
58Rule ConcatenationIterator::Next() {
59  ScopedVector<RuleIterator>::iterator current_iterator =
60      iterators_.begin();
61  DCHECK(current_iterator != iterators_.end());
62  DCHECK((*current_iterator)->HasNext());
63  const Rule& to_return = (*current_iterator)->Next();
64  if (!(*current_iterator)->HasNext())
65    iterators_.erase(current_iterator);
66  return to_return;
67}
68
69}  // namespace content_settings
70