Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3709)

Unified Diff: base/values.cc

Issue 2689673002: Inline base::BinaryValue into base::Value (Closed)
Patch Set: Rebase Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/values.h ('k') | base/values_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/values.cc
diff --git a/base/values.cc b/base/values.cc
index 96e3aa592904ab1e4ce75a3a74afed177eb57b80..e835e0088ec5a0191d5c44ffcee824e230c1a6d6 100644
--- a/base/values.cc
+++ b/base/values.cc
@@ -78,7 +78,7 @@ bool IsAssignmentSafe(Value::Type lhs, Value::Type rhs) {
auto IsImplemented = [](Value::Type type) {
return type == Value::Type::NONE || type == Value::Type::BOOLEAN ||
type == Value::Type::INTEGER || type == Value::Type::DOUBLE ||
- type == Value::Type::STRING;
+ type == Value::Type::STRING || type == Value::Type::BINARY;
};
return lhs == rhs || (IsImplemented(lhs) && IsImplemented(rhs));
@@ -91,6 +91,13 @@ std::unique_ptr<Value> Value::CreateNullValue() {
return WrapUnique(new Value(Type::NONE));
}
+// static
+std::unique_ptr<BinaryValue> BinaryValue::CreateWithCopiedBuffer(
+ const char* buffer,
+ size_t size) {
+ return MakeUnique<BinaryValue>(std::vector<char>(buffer, buffer + size));
+}
+
Value::Value(const Value& that) {
InternalCopyConstructFrom(that);
}
@@ -119,10 +126,12 @@ Value::Value(Type type) : type_(type) {
case Type::STRING:
string_value_.Init();
return;
+ case Type::BINARY:
+ binary_value_.Init();
+ return;
// TODO(crbug.com/646113): Implement these once the corresponding derived
// classes are removed.
- case Type::BINARY:
case Type::LIST:
case Type::DICTIONARY:
return;
@@ -166,6 +175,14 @@ Value::Value(const string16& in_string) : type_(Type::STRING) {
Value::Value(StringPiece in_string) : Value(in_string.as_string()) {}
+Value::Value(const std::vector<char>& in_blob) : type_(Type::BINARY) {
+ binary_value_.Init(in_blob);
+}
+
+Value::Value(std::vector<char>&& in_blob) : type_(Type::BINARY) {
+ binary_value_.Init(std::move(in_blob));
+}
+
Value& Value::operator=(const Value& that) {
if (this != &that) {
DCHECK(IsAssignmentSafe(type_, that.type_));
@@ -229,6 +246,19 @@ const std::string& Value::GetString() const {
return *string_value_;
}
+const std::vector<char>& Value::GetBlob() const {
+ CHECK(is_blob());
+ return *binary_value_;
+}
+
+size_t Value::GetSize() const {
+ return GetBlob().size();
+}
+
+const char* Value::GetBuffer() const {
+ return GetBlob().data();
+}
+
bool Value::GetAsBoolean(bool* out_value) const {
if (out_value && is_bool()) {
*out_value = bool_value_;
@@ -290,7 +320,11 @@ bool Value::GetAsString(StringPiece* out_value) const {
}
bool Value::GetAsBinary(const BinaryValue** out_value) const {
- return false;
+ if (out_value && is_blob()) {
+ *out_value = this;
+ return true;
+ }
+ return is_blob();
}
bool Value::GetAsList(ListValue** out_value) {
@@ -328,6 +362,10 @@ Value* Value::DeepCopy() const {
// Value when that code is deleted.
case Type::STRING:
return new StringValue(*string_value_);
+ // For now, make BinaryValues for backward-compatibility. Convert to
+ // Value when that code is deleted.
+ case Type::BINARY:
+ return new BinaryValue(*binary_value_);
default:
// All other types should be handled by subclasses.
@@ -355,6 +393,8 @@ bool Value::Equals(const Value* other) const {
return double_value_ == other->double_value_;
case Type::STRING:
return *string_value_ == *(other->string_value_);
+ case Type::BINARY:
+ return *binary_value_ == *(other->binary_value_);
default:
// This method should only be getting called for the above types -- all
// subclasses need to provide their own implementation;.
@@ -405,10 +445,12 @@ void Value::InternalCopyConstructFrom(const Value& that) {
case Type::STRING:
string_value_.Init(*that.string_value_);
return;
+ case Type::BINARY:
+ binary_value_.Init(*that.binary_value_);
+ return;
// TODO(crbug.com/646113): Implement these once the corresponding derived
// classes are removed.
- case Type::BINARY:
case Type::LIST:
case Type::DICTIONARY:
return;
@@ -429,10 +471,12 @@ void Value::InternalMoveConstructFrom(Value&& that) {
case Type::STRING:
string_value_.InitFromMove(std::move(that.string_value_));
return;
+ case Type::BINARY:
+ binary_value_.InitFromMove(std::move(that.binary_value_));
+ return;
// TODO(crbug.com/646113): Implement these once the corresponding derived
// classes are removed.
- case Type::BINARY:
case Type::LIST:
case Type::DICTIONARY:
return;
@@ -453,10 +497,12 @@ void Value::InternalCopyAssignFrom(const Value& that) {
case Type::STRING:
*string_value_ = *that.string_value_;
return;
+ case Type::BINARY:
+ *binary_value_ = *that.binary_value_;
+ return;
// TODO(crbug.com/646113): Implement these once the corresponding derived
// classes are removed.
- case Type::BINARY:
case Type::LIST:
case Type::DICTIONARY:
return;
@@ -477,10 +523,12 @@ void Value::InternalMoveAssignFrom(Value&& that) {
case Type::STRING:
*string_value_ = std::move(*that.string_value_);
return;
+ case Type::BINARY:
+ *binary_value_ = std::move(*that.binary_value_);
+ return;
// TODO(crbug.com/646113): Implement these once the corresponding derived
// classes are removed.
- case Type::BINARY:
case Type::LIST:
case Type::DICTIONARY:
return;
@@ -499,54 +547,18 @@ void Value::InternalCleanup() {
case Type::STRING:
string_value_.Destroy();
return;
+ case Type::BINARY:
+ binary_value_.Destroy();
+ return;
// TODO(crbug.com/646113): Implement these once the corresponding derived
// classes are removed.
- case Type::BINARY:
case Type::LIST:
case Type::DICTIONARY:
return;
}
}
-///////////////////// BinaryValue ////////////////////
-
-BinaryValue::BinaryValue() : Value(Type::BINARY), size_(0) {}
-
-BinaryValue::BinaryValue(std::unique_ptr<char[]> buffer, size_t size)
- : Value(Type::BINARY), buffer_(std::move(buffer)), size_(size) {}
-
-BinaryValue::~BinaryValue() {
-}
-
-// static
-std::unique_ptr<BinaryValue> BinaryValue::CreateWithCopiedBuffer(
- const char* buffer,
- size_t size) {
- std::unique_ptr<char[]> buffer_copy(new char[size]);
- memcpy(buffer_copy.get(), buffer, size);
- return MakeUnique<BinaryValue>(std::move(buffer_copy), size);
-}
-
-bool BinaryValue::GetAsBinary(const BinaryValue** out_value) const {
- if (out_value)
- *out_value = this;
- return true;
-}
-
-BinaryValue* BinaryValue::DeepCopy() const {
- return CreateWithCopiedBuffer(buffer_.get(), size_).release();
-}
-
-bool BinaryValue::Equals(const Value* other) const {
- if (other->GetType() != GetType())
- return false;
- const BinaryValue* other_binary = static_cast<const BinaryValue*>(other);
- if (other_binary->size_ != size_)
- return false;
- return !memcmp(GetBuffer(), other_binary->GetBuffer(), size_);
-}
-
///////////////////// DictionaryValue ////////////////////
// static
@@ -768,7 +780,7 @@ bool DictionaryValue::GetBinary(StringPiece path,
return false;
if (out_value)
- *out_value = static_cast<const BinaryValue*>(value);
+ *out_value = value;
return true;
}
@@ -1162,7 +1174,7 @@ bool ListValue::GetBinary(size_t index, const BinaryValue** out_value) const {
return false;
if (out_value)
- *out_value = static_cast<const BinaryValue*>(value);
+ *out_value = value;
return true;
}
« no previous file with comments | « base/values.h ('k') | base/values_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698