| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/values.h" | 5 #include "base/values.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <cmath> | 10 #include <cmath> |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 | 166 |
| 167 Value::Value(const std::vector<char>& in_blob) : type_(Type::BINARY) { | 167 Value::Value(const std::vector<char>& in_blob) : type_(Type::BINARY) { |
| 168 binary_value_.Init(in_blob); | 168 binary_value_.Init(in_blob); |
| 169 } | 169 } |
| 170 | 170 |
| 171 Value::Value(std::vector<char>&& in_blob) : type_(Type::BINARY) { | 171 Value::Value(std::vector<char>&& in_blob) : type_(Type::BINARY) { |
| 172 binary_value_.Init(std::move(in_blob)); | 172 binary_value_.Init(std::move(in_blob)); |
| 173 } | 173 } |
| 174 | 174 |
| 175 Value& Value::operator=(const Value& that) { | 175 Value& Value::operator=(const Value& that) { |
| 176 if (this != &that) { | 176 if (type_ == that.type_) { |
| 177 if (type_ == that.type_) { | 177 InternalCopyAssignFromSameType(that); |
| 178 InternalCopyAssignFromSameType(that); | 178 } else { |
| 179 } else { | 179 // This is not a self assignment because the type_ doesn't match. |
| 180 InternalCleanup(); | 180 InternalCleanup(); |
| 181 InternalCopyConstructFrom(that); | 181 InternalCopyConstructFrom(that); |
| 182 } | |
| 183 } | 182 } |
| 184 | 183 |
| 185 return *this; | 184 return *this; |
| 186 } | 185 } |
| 187 | 186 |
| 188 Value& Value::operator=(Value&& that) { | 187 Value& Value::operator=(Value&& that) { |
| 189 if (this != &that) { | 188 DCHECK(this != &that) << "attempt to self move assign."; |
| 190 if (type_ == that.type_) { | 189 InternalCleanup(); |
| 191 InternalMoveAssignFromSameType(std::move(that)); | 190 InternalMoveConstructFrom(std::move(that)); |
| 192 } else { | |
| 193 InternalCleanup(); | |
| 194 InternalMoveConstructFrom(std::move(that)); | |
| 195 } | |
| 196 } | |
| 197 | 191 |
| 198 return *this; | 192 return *this; |
| 199 } | 193 } |
| 200 | 194 |
| 201 Value::~Value() { | 195 Value::~Value() { |
| 202 InternalCleanup(); | 196 InternalCleanup(); |
| 203 alive_ = false; | 197 alive_ = false; |
| 204 } | 198 } |
| 205 | 199 |
| 206 // static | 200 // static |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 case Type::DICTIONARY: | 521 case Type::DICTIONARY: |
| 528 dict_ptr_.InitFromMove(std::move(that.dict_ptr_)); | 522 dict_ptr_.InitFromMove(std::move(that.dict_ptr_)); |
| 529 return; | 523 return; |
| 530 case Type::LIST: | 524 case Type::LIST: |
| 531 list_.InitFromMove(std::move(that.list_)); | 525 list_.InitFromMove(std::move(that.list_)); |
| 532 return; | 526 return; |
| 533 } | 527 } |
| 534 } | 528 } |
| 535 | 529 |
| 536 void Value::InternalCopyAssignFromSameType(const Value& that) { | 530 void Value::InternalCopyAssignFromSameType(const Value& that) { |
| 531 // TODO(crbug.com/646113): make this a DCHECK once base::Value does not have |
| 532 // subclasses. |
| 537 CHECK_EQ(type_, that.type_); | 533 CHECK_EQ(type_, that.type_); |
| 538 | 534 |
| 539 switch (type_) { | 535 switch (type_) { |
| 540 case Type::NONE: | 536 case Type::NONE: |
| 541 case Type::BOOLEAN: | 537 case Type::BOOLEAN: |
| 542 case Type::INTEGER: | 538 case Type::INTEGER: |
| 543 case Type::DOUBLE: | 539 case Type::DOUBLE: |
| 544 InternalCopyFundamentalValue(that); | 540 InternalCopyFundamentalValue(that); |
| 545 return; | 541 return; |
| 546 | 542 |
| 547 case Type::STRING: | 543 case Type::STRING: |
| 548 *string_value_ = *that.string_value_; | 544 *string_value_ = *that.string_value_; |
| 549 return; | 545 return; |
| 550 case Type::BINARY: | 546 case Type::BINARY: |
| 551 *binary_value_ = *that.binary_value_; | 547 *binary_value_ = *that.binary_value_; |
| 552 return; | 548 return; |
| 553 // DictStorage and ListStorage are move-only types due to the presence of | 549 // DictStorage and ListStorage are move-only types due to the presence of |
| 554 // unique_ptrs. This is why the call to |CreateDeepCopy| is necessary here. | 550 // unique_ptrs. This is why the call to |CreateDeepCopy| is necessary here. |
| 555 // TODO(crbug.com/646113): Clean this up when DictStorage and ListStorage | 551 // TODO(crbug.com/646113): Clean this up when DictStorage and ListStorage |
| 556 // can be copied directly. | 552 // can be copied directly. |
| 557 case Type::DICTIONARY: | 553 case Type::DICTIONARY: |
| 558 *dict_ptr_ = std::move(*that.CreateDeepCopy()->dict_ptr_); | 554 *dict_ptr_ = std::move(*that.CreateDeepCopy()->dict_ptr_); |
| 559 return; | 555 return; |
| 560 case Type::LIST: | 556 case Type::LIST: |
| 561 *list_ = std::move(*that.CreateDeepCopy()->list_); | 557 *list_ = std::move(*that.CreateDeepCopy()->list_); |
| 562 return; | 558 return; |
| 563 } | 559 } |
| 564 } | 560 } |
| 565 | 561 |
| 566 void Value::InternalMoveAssignFromSameType(Value&& that) { | |
| 567 CHECK_EQ(type_, that.type_); | |
| 568 | |
| 569 switch (type_) { | |
| 570 case Type::NONE: | |
| 571 case Type::BOOLEAN: | |
| 572 case Type::INTEGER: | |
| 573 case Type::DOUBLE: | |
| 574 InternalCopyFundamentalValue(that); | |
| 575 return; | |
| 576 | |
| 577 case Type::STRING: | |
| 578 *string_value_ = std::move(*that.string_value_); | |
| 579 return; | |
| 580 case Type::BINARY: | |
| 581 *binary_value_ = std::move(*that.binary_value_); | |
| 582 return; | |
| 583 case Type::DICTIONARY: | |
| 584 *dict_ptr_ = std::move(*that.dict_ptr_); | |
| 585 return; | |
| 586 case Type::LIST: | |
| 587 *list_ = std::move(*that.list_); | |
| 588 return; | |
| 589 } | |
| 590 } | |
| 591 | |
| 592 void Value::InternalCleanup() { | 562 void Value::InternalCleanup() { |
| 593 CHECK(alive_); | 563 CHECK(alive_); |
| 594 | 564 |
| 595 switch (type_) { | 565 switch (type_) { |
| 596 case Type::NONE: | 566 case Type::NONE: |
| 597 case Type::BOOLEAN: | 567 case Type::BOOLEAN: |
| 598 case Type::INTEGER: | 568 case Type::INTEGER: |
| 599 case Type::DOUBLE: | 569 case Type::DOUBLE: |
| 600 // Nothing to do | 570 // Nothing to do |
| 601 return; | 571 return; |
| (...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1358 } | 1328 } |
| 1359 | 1329 |
| 1360 std::ostream& operator<<(std::ostream& out, const Value::Type& type) { | 1330 std::ostream& operator<<(std::ostream& out, const Value::Type& type) { |
| 1361 if (static_cast<int>(type) < 0 || | 1331 if (static_cast<int>(type) < 0 || |
| 1362 static_cast<size_t>(type) >= arraysize(kTypeNames)) | 1332 static_cast<size_t>(type) >= arraysize(kTypeNames)) |
| 1363 return out << "Invalid Type (index = " << static_cast<int>(type) << ")"; | 1333 return out << "Invalid Type (index = " << static_cast<int>(type) << ")"; |
| 1364 return out << Value::GetTypeName(type); | 1334 return out << Value::GetTypeName(type); |
| 1365 } | 1335 } |
| 1366 | 1336 |
| 1367 } // namespace base | 1337 } // namespace base |
| OLD | NEW |