values.cc revision 58537e28ecd584eab876aee8be7156509866d23a
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <string.h> 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ostream> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/float_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/move.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace base { 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make a deep copy of |node|, but don't include empty lists or dictionaries 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the copy. It's possible for this function to return NULL and it 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expects |node| to always be non-NULL. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value* CopyWithoutEmptyChildren(const Value* node) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(node); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->GetType()) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Value::TYPE_LIST: { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ListValue* list = static_cast<const ListValue*>(node); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* copy = new ListValue; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ListValue::const_iterator it = list->begin(); it != list->end(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* child_copy = CopyWithoutEmptyChildren(*it); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_copy) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->Append(child_copy); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!copy->empty()) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete copy; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Value::TYPE_DICTIONARY: { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DictionaryValue* dict = static_cast<const DictionaryValue*>(node); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* copy = new DictionaryValue; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Value* child_copy = CopyWithoutEmptyChildren(&it.value()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_copy) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy->SetWithoutPathExpansion(it.key(), child_copy); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!copy->empty()) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete copy; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For everything else, just make a copy. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node->DeepCopy(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A small functor for comparing Values for std::find_if and similar. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ValueEquals { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pass the value against which all consecutive calls of the () operator will 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compare their argument to. This Value object must not be destroyed while 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ValueEquals is in use. 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit ValueEquals(const Value* first) : first_(first) { } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator ()(const Value* second) const { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return first_->Equals(second); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* first_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value::~Value() { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* Value::CreateNullValue() { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new Value(TYPE_NULL); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateBooleanValue(bool in_value) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateIntegerValue(int in_value) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* Value::CreateDoubleValue(double in_value) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FundamentalValue(in_value); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue* Value::CreateStringValue(const std::string& in_value) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new StringValue(in_value); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue* Value::CreateStringValue(const string16& in_value) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new StringValue(in_value); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsBoolean(bool* out_value) const { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsInteger(int* out_value) const { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDouble(double* out_value) const { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsString(std::string* out_value) const { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsString(string16* out_value) const { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsList(ListValue** out_value) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsList(const ListValue** out_value) const { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDictionary(DictionaryValue** out_value) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::GetAsDictionary(const DictionaryValue** out_value) const { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* Value::DeepCopy() const { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method should only be getting called for null Values--all subclasses 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to provide their own implementation;. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsType(TYPE_NULL)); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateNullValue(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::Equals(const Value* other) const { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method should only be getting called for null Values--all subclasses 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to provide their own implementation;. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsType(TYPE_NULL)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return other->IsType(TYPE_NULL); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Value::Equals(const Value* a, const Value* b) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((a == NULL) && (b == NULL)) return true; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((a == NULL) ^ (b == NULL)) return false; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a->Equals(b); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value::Value(Type type) : type_(type) {} 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value::Value(const Value& that) : type_(that.type_) {} 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Value& Value::operator=(const Value& that) { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = that.type_; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// FundamentalValue //////////////////// 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::FundamentalValue(bool in_value) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_BOOLEAN), boolean_value_(in_value) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::FundamentalValue(int in_value) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_INTEGER), integer_value_(in_value) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::FundamentalValue(double in_value) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_DOUBLE), double_value_(in_value) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsFinite(double_value_)) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Non-finite (i.e. NaN or positive/negative infinity) " 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "values cannot be represented in JSON"; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_value_ = 0.0; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue::~FundamentalValue() { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::GetAsBoolean(bool* out_value) const { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value && IsType(TYPE_BOOLEAN)) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = boolean_value_; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (IsType(TYPE_BOOLEAN)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::GetAsInteger(int* out_value) const { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value && IsType(TYPE_INTEGER)) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = integer_value_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (IsType(TYPE_INTEGER)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::GetAsDouble(double* out_value) const { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value && IsType(TYPE_DOUBLE)) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = double_value_; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (out_value && IsType(TYPE_INTEGER)) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = integer_value_; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (IsType(TYPE_DOUBLE) || IsType(TYPE_INTEGER)); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FundamentalValue* FundamentalValue::DeepCopy() const { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (GetType()) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_BOOLEAN: 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateBooleanValue(boolean_value_); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_INTEGER: 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateIntegerValue(integer_value_); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_DOUBLE: 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateDoubleValue(double_value_); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FundamentalValue::Equals(const Value* other) const { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (GetType()) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_BOOLEAN: { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool lhs, rhs; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsBoolean(&lhs) && other->GetAsBoolean(&rhs) && lhs == rhs; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_INTEGER: { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int lhs, rhs; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsInteger(&lhs) && other->GetAsInteger(&rhs) && lhs == rhs; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_DOUBLE: { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double lhs, rhs; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsDouble(&lhs) && other->GetAsDouble(&rhs) && lhs == rhs; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// StringValue //////////////////// 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue::StringValue(const std::string& in_value) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_STRING), 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_(in_value) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(in_value)); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue::StringValue(const string16& in_value) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_STRING), 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_(UTF16ToUTF8(in_value)) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue::~StringValue() { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StringValue::GetAsString(std::string* out_value) const { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = value_; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StringValue::GetAsString(string16* out_value) const { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = UTF8ToUTF16(value_); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringValue* StringValue::DeepCopy() const { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateStringValue(value_); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool StringValue::Equals(const Value* other) const { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string lhs, rhs; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetAsString(&lhs) && other->GetAsString(&rhs) && lhs == rhs; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// BinaryValue //////////////////// 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BinaryValue::BinaryValue() 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Value(TYPE_BINARY), 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_(0) { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BinaryValue::BinaryValue(scoped_ptr<char[]> buffer, size_t size) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Value(TYPE_BINARY), 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer_(buffer.Pass()), 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_(size) { 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BinaryValue::~BinaryValue() { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BinaryValue* BinaryValue::CreateWithCopiedBuffer(const char* buffer, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size) { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* buffer_copy = new char[size]; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(buffer_copy, buffer, size); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<char[]> scoped_buffer_copy(buffer_copy); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new BinaryValue(scoped_buffer_copy.Pass(), size); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BinaryValue* BinaryValue::DeepCopy() const { 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CreateWithCopiedBuffer(buffer_.get(), size_); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BinaryValue::Equals(const Value* other) const { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BinaryValue* other_binary = static_cast<const BinaryValue*>(other); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other_binary->size_ != size_) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !memcmp(GetBuffer(), other_binary->GetBuffer(), size_); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// DictionaryValue //////////////////// 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::DictionaryValue() 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Value(TYPE_DICTIONARY) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::~DictionaryValue() { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetAsDictionary(DictionaryValue** out_value) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetAsDictionary(const DictionaryValue** out_value) const { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::HasKey(const std::string& key) const { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(key)); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::const_iterator current_entry = dictionary_.find(key); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK((current_entry == dictionary_.end()) || current_entry->second); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_entry != dictionary_.end(); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Clear() { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::iterator dict_iterator = dictionary_.begin(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (dict_iterator != dictionary_.end()) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete dict_iterator->second; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++dict_iterator; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.clear(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Set(const std::string& path, Value* in_value) { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* current_dictionary = this; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t delimiter_position = current_path.find('.'); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position != std::string::npos; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position = current_path.find('.')) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume that we're indexing into a dictionary. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key(current_path, 0, delimiter_position); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* child_dictionary = NULL; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!current_dictionary->GetDictionary(key, &child_dictionary)) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_dictionary = new DictionaryValue; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary->SetWithoutPathExpansion(key, child_dictionary); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary = child_dictionary; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary->SetWithoutPathExpansion(current_path, in_value); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetBoolean(const std::string& path, bool in_value) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateBooleanValue(in_value)); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetInteger(const std::string& path, int in_value) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateIntegerValue(in_value)); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetDouble(const std::string& path, double in_value) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateDoubleValue(in_value)); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetString(const std::string& path, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& in_value) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateStringValue(in_value)); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetString(const std::string& path, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& in_value) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set(path, CreateStringValue(in_value)); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetWithoutPathExpansion(const std::string& key, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* in_value) { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there's an existing value here, we need to delete it, because 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we own all our children. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<ValueMap::iterator, bool> ins_res = 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.insert(std::make_pair(key, in_value)); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ins_res.second) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(ins_res.first->second, in_value); // This would be bogus 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete ins_res.first->second; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ins_res.first->second = in_value; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetBooleanWithoutPathExpansion( 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, bool in_value) { 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateBooleanValue(in_value)); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetIntegerWithoutPathExpansion( 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, int in_value) { 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateIntegerValue(in_value)); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetDoubleWithoutPathExpansion( 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, double in_value) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateDoubleValue(in_value)); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetStringWithoutPathExpansion( 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, const std::string& in_value) { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateStringValue(in_value)); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::SetStringWithoutPathExpansion( 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, const string16& in_value) { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWithoutPathExpansion(path, CreateStringValue(in_value)); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Get( 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, const Value** out_value) const { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 468b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// LOG(WARNING) << "\n1\n"; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* current_dictionary = this; 471b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// LOG(WARNING) << "\n2\n"; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t delimiter_position = current_path.find('.'); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position != std::string::npos; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delimiter_position = current_path.find('.')) { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* child_dictionary = NULL; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!current_dictionary->GetDictionary( 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.substr(0, delimiter_position), &child_dictionary)) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_dictionary = child_dictionary; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 483b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// LOG(WARNING) << "\n3\n"; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_dictionary->GetWithoutPathExpansion(current_path, out_value); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Get(const std::string& path, Value** out_value) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).Get( 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const Value**>(out_value)); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBoolean(const std::string& path, 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* bool_value) const { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsBoolean(bool_value); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetInteger(const std::string& path, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* out_value) const { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsInteger(out_value); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDouble(const std::string& path, 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double* out_value) const { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsDouble(out_value); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetString(const std::string& path, 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* out_value) const { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetString(const std::string& path, 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16* out_value) const { 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(path, &value)) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetStringASCII(const std::string& path, 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* out_value) const { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string out; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetString(path, &out)) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsStringASCII(out)) { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_value->assign(out); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBinary(const std::string& path, 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BinaryValue** out_value) const { 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(path, &value); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_BINARY)) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const BinaryValue*>(value); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBinary(const std::string& path, 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BinaryValue** out_value) { 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetBinary( 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const BinaryValue**>(out_value)); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionary(const std::string& path, 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue** out_value) const { 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(path, &value); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_DICTIONARY)) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const DictionaryValue*>(value); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionary(const std::string& path, 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue** out_value) { 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetDictionary( 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const DictionaryValue**>(out_value)); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetList(const std::string& path, 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue** out_value) const { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(path, &value); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_LIST)) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const ListValue*>(value); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetList(const std::string& path, ListValue** out_value) { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetList( 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path, 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const ListValue**>(out_value)); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetWithoutPathExpansion(const std::string& key, 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value** out_value) const { 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(key)); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::const_iterator entry_iterator = dictionary_.find(key); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_iterator == dictionary_.end()) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* entry = entry_iterator->second; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = entry; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetWithoutPathExpansion(const std::string& key, 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value** out_value) { 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const DictionaryValue&>(*this).GetWithoutPathExpansion( 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key, 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const Value**>(out_value)); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetBooleanWithoutPathExpansion(const std::string& key, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* out_value) const { 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsBoolean(out_value); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetIntegerWithoutPathExpansion(const std::string& key, 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* out_value) const { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsInteger(out_value); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDoubleWithoutPathExpansion(const std::string& key, 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double* out_value) const { 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsDouble(out_value); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetStringWithoutPathExpansion( 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* out_value) const { 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetStringWithoutPathExpansion(const std::string& key, 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16* out_value) const { 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWithoutPathExpansion(key, &value)) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionaryWithoutPathExpansion( 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue** out_value) const { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = GetWithoutPathExpansion(key, &value); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_DICTIONARY)) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const DictionaryValue*>(value); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetDictionaryWithoutPathExpansion( 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue** out_value) { 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue& const_this = 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const DictionaryValue&>(*this); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return const_this.GetDictionaryWithoutPathExpansion( 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key, 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const DictionaryValue**>(out_value)); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetListWithoutPathExpansion( 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue** out_value) const { 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = GetWithoutPathExpansion(key, &value); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_LIST)) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const ListValue*>(value); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::GetListWithoutPathExpansion(const std::string& key, 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue** out_value) { 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const DictionaryValue&>(*this).GetListWithoutPathExpansion( 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key, 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const ListValue**>(out_value)); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbool DictionaryValue::Remove(const std::string& path, 7263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value>* out_value) { 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(path)); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_path(path); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* current_dictionary = this; 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t delimiter_position = current_path.rfind('.'); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delimiter_position != std::string::npos) { 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetDictionary(current_path.substr(0, delimiter_position), 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ¤t_dictionary)) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path.erase(0, delimiter_position + 1); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_dictionary->RemoveWithoutPathExpansion(current_path, 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_value); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::RemoveWithoutPathExpansion(const std::string& key, 7433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value>* out_value) { 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsStringUTF8(key)); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::iterator entry_iterator = dictionary_.find(key); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry_iterator == dictionary_.end()) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* entry = entry_iterator->second; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 7513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch out_value->reset(entry); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete entry; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.erase(entry_iterator); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DictionaryValue* DictionaryValue::DeepCopyWithoutEmptyChildren() const { 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* copy = CopyWithoutEmptyChildren(this); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy ? static_cast<DictionaryValue*>(copy) : new DictionaryValue; 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::MergeDictionary(const DictionaryValue* dictionary) { 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DictionaryValue::Iterator it(*dictionary); !it.IsAtEnd(); it.Advance()) { 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Value* merge_value = &it.value(); 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check whether we have to merge dictionaries. 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (merge_value->IsType(Value::TYPE_DICTIONARY)) { 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* sub_dict; 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetDictionaryWithoutPathExpansion(it.key(), &sub_dict)) { 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sub_dict->MergeDictionary( 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<const DictionaryValue*>(merge_value)); 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All other cases: Make a copy and hook it up. 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetWithoutPathExpansion(it.key(), merge_value->DeepCopy()); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DictionaryValue::Swap(DictionaryValue* other) { 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dictionary_.swap(other->dictionary_); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue::Iterator::Iterator(const DictionaryValue& target) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : target_(target), 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it_(target.dictionary_.begin()) {} 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* DictionaryValue::DeepCopy() const { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* result = new DictionaryValue; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueMap::const_iterator current_entry(dictionary_.begin()); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_entry != dictionary_.end(); ++current_entry) { 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->SetWithoutPathExpansion(current_entry->first, 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_entry->second->DeepCopy()); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DictionaryValue::Equals(const Value* other) const { 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* other_dict = 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const DictionaryValue*>(other); 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Iterator lhs_it(*this); 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Iterator rhs_it(*other_dict); 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (!lhs_it.IsAtEnd() && !rhs_it.IsAtEnd()) { 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (lhs_it.key() != rhs_it.key() || 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !lhs_it.value().Equals(&rhs_it.value())) { 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lhs_it.Advance(); 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rhs_it.Advance(); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!lhs_it.IsAtEnd() || !rhs_it.IsAtEnd()) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////// ListValue //////////////////// 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::ListValue() : Value(TYPE_LIST) { 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::~ListValue() { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Clear() { 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::iterator i(list_.begin()); i != list_.end(); ++i) 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *i; 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.clear(); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Set(size_t index, Value* in_value) { 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!in_value) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) { 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pad out any intermediate indexes with null settings 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (index > list_.size()) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateNullValue()); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(in_value); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(list_[index] != in_value); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete list_[index]; 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_[index] = in_value; 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Get(size_t index, const Value** out_value) const { 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = list_[index]; 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Get(size_t index, Value** out_value) { 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).Get( 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const Value**>(out_value)); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBoolean(size_t index, bool* bool_value) const { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsBoolean(bool_value); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetInteger(size_t index, int* out_value) const { 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsInteger(out_value); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDouble(size_t index, double* out_value) const { 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsDouble(out_value); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetString(size_t index, std::string* out_value) const { 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetString(size_t index, string16* out_value) const { 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Get(index, &value)) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value->GetAsString(out_value); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBinary(size_t index, const BinaryValue** out_value) const { 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_BINARY)) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const BinaryValue*>(value); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetBinary(size_t index, BinaryValue** out_value) { 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetBinary( 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const BinaryValue**>(out_value)); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDictionary(size_t index, 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue** out_value) const { 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_DICTIONARY)) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const DictionaryValue*>(value); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetDictionary(size_t index, DictionaryValue** out_value) { 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetDictionary( 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const DictionaryValue**>(out_value)); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetList(size_t index, const ListValue** out_value) const { 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* value; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = Get(index, &value); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !value->IsType(TYPE_LIST)) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = static_cast<const ListValue*>(value); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetList(size_t index, ListValue** out_value) { 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<const ListValue&>(*this).GetList( 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<const ListValue**>(out_value)); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbool ListValue::Remove(size_t index, scoped_ptr<Value>* out_value) { 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= list_.size()) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch out_value->reset(list_[index]); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete list_[index]; 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.erase(list_.begin() + index); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Remove(const Value& value, size_t* index) { 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::iterator i(list_.begin()); i != list_.end(); ++i) { 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->Equals(&value)) { 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t previous_index = i - list_.begin(); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *i; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.erase(i); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *index = previous_index; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochListValue::iterator ListValue::Erase(iterator iter, 9943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value>* out_value) { 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 9963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch out_value->reset(*iter); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *iter; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return list_.erase(iter); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Append(Value* in_value) { 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.push_back(in_value); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendBoolean(bool in_value) { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateBooleanValue(in_value)); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendInteger(int in_value) { 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateIntegerValue(in_value)); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendDouble(double in_value) { 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateDoubleValue(in_value)); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendString(const std::string& in_value) { 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateStringValue(in_value)); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendString(const string16& in_value) { 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Append(CreateStringValue(in_value)); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendStrings(const std::vector<std::string>& in_values) { 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = in_values.begin(); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != in_values.end(); ++it) { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendString(*it); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::AppendStrings(const std::vector<string16>& in_values) { 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<string16>::const_iterator it = in_values.begin(); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != in_values.end(); ++it) { 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendString(*it); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::AppendIfNotPresent(Value* in_value) { 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::const_iterator i(list_.begin()); i != list_.end(); ++i) { 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*i)->Equals(in_value)) { 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete in_value; 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.push_back(in_value); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Insert(size_t index, Value* in_value) { 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_value); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index > list_.size()) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.insert(list_.begin() + index, in_value); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue::const_iterator ListValue::Find(const Value& value) const { 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::find_if(list_.begin(), list_.end(), ValueEquals(&value)); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ListValue::Swap(ListValue* other) { 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_.swap(other->list_); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetAsList(ListValue** out_value) { 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::GetAsList(const ListValue** out_value) const { 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out_value) 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_value = this; 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ListValue* ListValue::DeepCopy() const { 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* result = new ListValue; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ValueVector::const_iterator i(list_.begin()); i != list_.end(); ++i) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->Append((*i)->DeepCopy()); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ListValue::Equals(const Value* other) const { 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->GetType() != GetType()) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* other_list = 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const ListValue*>(other); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator lhs_it, rhs_it; 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (lhs_it = begin(), rhs_it = other_list->begin(); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lhs_it != end() && rhs_it != other_list->end(); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++lhs_it, ++rhs_it) { 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(*lhs_it)->Equals(*rhs_it)) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lhs_it != end() || rhs_it != other_list->end()) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueSerializer::~ValueSerializer() { 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::ostream& operator<<(std::ostream& out, const Value& value) { 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONWriter::WriteWithOptions(&value, 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONWriter::OPTIONS_PRETTY_PRINT, 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &json); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return out << json; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 1123