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