 Chromium Code Reviews
 Chromium Code Reviews Issue 2516363005:
  Inline StringValue into base::Value  (Closed)
    
  
    Issue 2516363005:
  Inline StringValue into base::Value  (Closed) 
  | Index: base/values.cc | 
| diff --git a/base/values.cc b/base/values.cc | 
| index 3d2bb6c6e6a2b2ca3d7b7b3fd743ab1de521a10d..c34b0e5e28615b08a34d2e76d8d129bfd0c628dd 100644 | 
| --- a/base/values.cc | 
| +++ b/base/values.cc | 
| @@ -88,6 +88,19 @@ Value::Value(double in_double) : type_(TYPE_DOUBLE), double_value_(in_double) { | 
| } | 
| } | 
| +Value::Value(const char* in_string) : type_(TYPE_STRING) { | 
| + string_value_.Init(in_string); | 
| +} | 
| + | 
| +Value::Value(StringPiece in_string) : type_(TYPE_STRING) { | 
| + string_value_.Init(in_string.as_string()); | 
| + DCHECK(IsStringUTF8(in_string)); | 
| +} | 
| + | 
| +Value::Value(const string16& in_string) : type_(TYPE_STRING) { | 
| + string_value_.Init(UTF16ToUTF8(in_string)); | 
| +} | 
| + | 
| Value::~Value() { | 
| } | 
| @@ -122,6 +135,16 @@ double Value::GetDouble() const { | 
| return 0.0; | 
| } | 
| +std::string* Value::GetString() { | 
| + CHECK(is_string()); | 
| + return string_value_.get(); | 
| +} | 
| + | 
| +const std::string& Value::GetString() const { | 
| + CHECK(is_string()); | 
| + return *string_value_; | 
| +} | 
| + | 
| bool Value::GetAsBinary(const BinaryValue** out_value) const { | 
| return false; | 
| } | 
| @@ -155,15 +178,27 @@ bool Value::GetAsDouble(double* out_value) const { | 
| } | 
| bool Value::GetAsString(std::string* out_value) const { | 
| - return false; | 
| + if (out_value && is_string()) { | 
| + *out_value = *string_value_; | 
| + return true; | 
| + } | 
| + return is_string(); | 
| } | 
| bool Value::GetAsString(string16* out_value) const { | 
| - return false; | 
| + if (out_value && is_string()) { | 
| + *out_value = UTF8ToUTF16(*string_value_); | 
| + return true; | 
| + } | 
| + return is_string(); | 
| } | 
| bool Value::GetAsString(const StringValue** out_value) const { | 
| - return false; | 
| + if (out_value && is_string()) { | 
| + *out_value = static_cast<const StringValue*>(this); | 
| + return true; | 
| + } | 
| + return is_string(); | 
| } | 
| bool Value::GetAsList(ListValue** out_value) { | 
| @@ -197,6 +232,10 @@ Value* Value::DeepCopy() const { | 
| return new FundamentalValue(int_value_); | 
| case TYPE_DOUBLE: | 
| return new FundamentalValue(double_value_); | 
| + // For now, make StringValues for backward-compatibility. Convert to | 
| + // Value when that code is deleted. | 
| + case TYPE_STRING: | 
| + return new StringValue(*string_value_); | 
| default: | 
| // All other types should be handled by subclasses. | 
| @@ -222,6 +261,11 @@ bool Value::Equals(const Value* other) const { | 
| return int_value_ == other->int_value_; | 
| case TYPE_DOUBLE: | 
| return double_value_ == other->double_value_; | 
| + // TODO(jdoerrie): Simplify this once JSONStringValue is migrated. | 
| + case TYPE_STRING: { | 
| + std::string lhs, rhs; | 
| + return GetAsString(&lhs) && other->GetAsString(&rhs) && lhs == rhs; | 
| + } | 
| default: | 
| // This method should only be getting called for the above types -- all | 
| // subclasses need to provide their own implementation;. | 
| @@ -265,56 +309,13 @@ FundamentalValue::~FundamentalValue() { | 
| ///////////////////// StringValue //////////////////// | 
| -StringValue::StringValue(StringPiece in_value) | 
| - : Value(TYPE_STRING), value_(in_value.as_string()) { | 
| - DCHECK(IsStringUTF8(in_value)); | 
| -} | 
| +StringValue::StringValue(StringPiece in_value) : Value(in_value) {} | 
| -StringValue::StringValue(const string16& in_value) | 
| - : Value(TYPE_STRING), | 
| - value_(UTF16ToUTF8(in_value)) { | 
| -} | 
| +StringValue::StringValue(const string16& in_value) : Value(in_value) {} | 
| StringValue::~StringValue() { | 
| } | 
| 
vabr (Chromium)
2016/12/07 10:17:27
Should this (or ~Value) run string_value_.Destroy(
 
jdoerrie
2016/12/08 09:59:34
Done. Implemented it as part of InternalCleanup. C
 | 
| -std::string* StringValue::GetString() { | 
| - return &value_; | 
| -} | 
| - | 
| -const std::string& StringValue::GetString() const { | 
| - return value_; | 
| -} | 
| - | 
| -bool StringValue::GetAsString(std::string* out_value) const { | 
| - if (out_value) | 
| - *out_value = value_; | 
| - return true; | 
| -} | 
| - | 
| -bool StringValue::GetAsString(string16* out_value) const { | 
| - if (out_value) | 
| - *out_value = UTF8ToUTF16(value_); | 
| - return true; | 
| -} | 
| - | 
| -bool StringValue::GetAsString(const StringValue** out_value) const { | 
| - if (out_value) | 
| - *out_value = this; | 
| - return true; | 
| -} | 
| - | 
| -StringValue* StringValue::DeepCopy() const { | 
| - return new StringValue(value_); | 
| -} | 
| - | 
| -bool StringValue::Equals(const Value* other) const { | 
| - if (other->GetType() != GetType()) | 
| - return false; | 
| - std::string lhs, rhs; | 
| - return GetAsString(&lhs) && other->GetAsString(&rhs) && lhs == rhs; | 
| -} | 
| - | 
| ///////////////////// BinaryValue //////////////////// | 
| BinaryValue::BinaryValue() |