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