pref_value_map.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
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 "chrome/browser/prefs/pref_value_map.h"
6
7#include "base/logging.h"
8#include "base/scoped_ptr.h"
9#include "base/stl_util-inl.h"
10#include "base/values.h"
11
12PrefValueMap::PrefValueMap() {}
13
14PrefValueMap::~PrefValueMap() {
15  Clear();
16}
17
18bool PrefValueMap::GetValue(const std::string& key, Value** value) const {
19  const Map::const_iterator entry = prefs_.find(key);
20  if (entry != prefs_.end()) {
21    if (value)
22      *value = entry->second;
23    return true;
24  }
25
26  return false;
27}
28
29bool PrefValueMap::SetValue(const std::string& key, Value* value) {
30  DCHECK(value);
31  scoped_ptr<Value> value_ptr(value);
32  const Map::iterator entry = prefs_.find(key);
33  if (entry != prefs_.end()) {
34    if (Value::Equals(entry->second, value))
35      return false;
36    delete entry->second;
37    entry->second = value_ptr.release();
38  } else {
39    prefs_[key] = value_ptr.release();
40  }
41
42  return true;
43}
44
45bool PrefValueMap::RemoveValue(const std::string& key) {
46  const Map::iterator entry = prefs_.find(key);
47  if (entry != prefs_.end()) {
48    delete entry->second;
49    prefs_.erase(entry);
50    return true;
51  }
52
53  return false;
54}
55
56void PrefValueMap::Clear() {
57  STLDeleteValues(&prefs_);
58  prefs_.clear();
59}
60
61PrefValueMap::iterator PrefValueMap::begin() {
62  return prefs_.begin();
63}
64
65PrefValueMap::iterator PrefValueMap::end() {
66  return prefs_.end();
67}
68
69PrefValueMap::const_iterator PrefValueMap::begin() const {
70  return prefs_.begin();
71}
72
73PrefValueMap::const_iterator PrefValueMap::end() const {
74  return prefs_.end();
75}
76
77bool PrefValueMap::GetBoolean(const std::string& key,
78                              bool* value) const {
79  Value* stored_value = NULL;
80  return GetValue(key, &stored_value) && stored_value->GetAsBoolean(value);
81}
82
83bool PrefValueMap::GetString(const std::string& key,
84                             std::string* value) const {
85  Value* stored_value = NULL;
86  return GetValue(key, &stored_value) && stored_value->GetAsString(value);
87}
88
89void PrefValueMap::SetString(const std::string& key,
90                             const std::string& value) {
91  SetValue(key, Value::CreateStringValue(value));
92}
93
94void PrefValueMap::GetDifferingKeys(
95    const PrefValueMap* other,
96    std::vector<std::string>* differing_keys) const {
97  differing_keys->clear();
98
99  // Walk over the maps in lockstep, adding everything that is different.
100  Map::const_iterator this_pref(prefs_.begin());
101  Map::const_iterator other_pref(other->prefs_.begin());
102  while (this_pref != prefs_.end() && other_pref != other->prefs_.end()) {
103    const int diff = this_pref->first.compare(other_pref->first);
104    if (diff == 0) {
105      if (!this_pref->second->Equals(other_pref->second))
106        differing_keys->push_back(this_pref->first);
107      ++this_pref;
108      ++other_pref;
109    } else if (diff < 0) {
110      differing_keys->push_back(this_pref->first);
111      ++this_pref;
112    } else if (diff > 0) {
113      differing_keys->push_back(other_pref->first);
114      ++other_pref;
115    }
116  }
117
118  // Add the remaining entries.
119  for ( ; this_pref != prefs_.end(); ++this_pref)
120      differing_keys->push_back(this_pref->first);
121  for ( ; other_pref != other->prefs_.end(); ++other_pref)
122      differing_keys->push_back(other_pref->first);
123}
124