Index: base/values.h |
diff --git a/base/values.h b/base/values.h |
index 22d6b231cc21ad3f7868c98994c1f4015f8238ee..e021f7be23a4ba438056448ddbd67cac81d6237c 100644 |
--- a/base/values.h |
+++ b/base/values.h |
@@ -30,6 +30,7 @@ |
#include "base/base_export.h" |
#include "base/compiler_specific.h" |
#include "base/macros.h" |
+#include "base/memory/manual_constructor.h" |
#include "base/strings/string16.h" |
#include "base/strings/string_piece.h" |
@@ -38,9 +39,9 @@ namespace base { |
class BinaryValue; |
class DictionaryValue; |
class ListValue; |
-class StringValue; |
class Value; |
using FundamentalValue = Value; |
+using StringValue = Value; |
// The Value class is the base class for Values. A Value can be instantiated |
// via the Create*Value() factory methods, or by directly creating instances of |
@@ -71,6 +72,19 @@ class BASE_EXPORT Value { |
explicit Value(int in_int); |
explicit Value(double in_double); |
+ // Value(const char*) and Value(const char16*) are required despite |
+ // Value(const std::string&) and Value(const string16&) because otherwise the |
+ // compiler will choose the Value(bool) constructor for these arguments. |
+ // Value(std::string&&) allow for efficient move construction. |
+ // Value(StringPiece) exists due to many callsites passing StringPieces as |
+ // arguments. |
+ explicit Value(const char* in_string); |
+ explicit Value(const std::string& in_string); |
+ explicit Value(std::string&& in_string); |
+ explicit Value(const char16* in_string); |
+ explicit Value(const string16& in_string); |
+ explicit Value(StringPiece in_string); |
+ |
Value& operator=(const Value& that); |
Value& operator=(Value&& that); |
@@ -101,6 +115,7 @@ class BASE_EXPORT Value { |
bool GetBool() const; |
int GetInt() const; |
double GetDouble() const; // Implicitly converts from int if necessary. |
+ const std::string& GetString() const; |
// These methods allow the convenient retrieval of the contents of the Value. |
// If the current object can be converted into the given type, the value is |
@@ -137,44 +152,26 @@ class BASE_EXPORT Value { |
// NULLs are considered equal but different from Value::CreateNullValue(). |
static bool Equals(const Value* a, const Value* b); |
- private: |
- void InternalCopyFrom(const Value& that); |
- |
+ protected: |
+ // TODO(crbug.com/646113): Make this private once JSONStringValue is removed. |
Type type_; |
+ private: |
+ void InternalCopyFundamentalValue(const Value& that); |
+ void InternalCopyConstructFrom(const Value& that); |
+ void InternalMoveConstructFrom(Value&& that); |
+ void InternalCopyAssignFrom(const Value& that); |
+ void InternalMoveAssignFrom(Value&& that); |
+ void InternalCleanup(); |
+ |
union { |
bool bool_value_; |
int int_value_; |
double double_value_; |
+ ManualConstructor<std::string> string_value_; |
}; |
}; |
-class BASE_EXPORT StringValue : public Value { |
- public: |
- // Initializes a StringValue with a UTF-8 narrow character string. |
- explicit StringValue(StringPiece in_value); |
- |
- // Initializes a StringValue with a string16. |
- explicit StringValue(const string16& in_value); |
- |
- ~StringValue() override; |
- |
- // Returns |value_| as a pointer or reference. |
- std::string* GetString(); |
- const std::string& GetString() const; |
- |
- // Overridden from Value: |
- bool GetAsString(std::string* out_value) const override; |
- bool GetAsString(string16* out_value) const override; |
- bool GetAsString(const StringValue** out_value) const override; |
- bool GetAsString(StringPiece* out_value) const override; |
- StringValue* DeepCopy() const override; |
- bool Equals(const Value* other) const override; |
- |
- private: |
- std::string value_; |
-}; |
- |
class BASE_EXPORT BinaryValue: public Value { |
public: |
// Creates a BinaryValue with a null buffer and size of 0. |
@@ -545,11 +542,6 @@ class BASE_EXPORT ValueDeserializer { |
BASE_EXPORT std::ostream& operator<<(std::ostream& out, const Value& value); |
BASE_EXPORT inline std::ostream& operator<<(std::ostream& out, |
- const StringValue& value) { |
- return out << static_cast<const Value&>(value); |
-} |
- |
-BASE_EXPORT inline std::ostream& operator<<(std::ostream& out, |
const DictionaryValue& value) { |
return out << static_cast<const Value&>(value); |
} |