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