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