| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // This file specifies a recursive data storage class called Value intended for | |
| 6 // storing settings and other persistable data. | |
| 7 // | |
| 8 // A Value represents something that can be stored in JSON or passed to/from | |
| 9 // JavaScript. As such, it is NOT a generalized variant type, since only the | |
| 10 // types supported by JavaScript/JSON are supported. | |
| 11 // | |
| 12 // IN PARTICULAR this means that there is no support for int64 or unsigned | |
| 13 // numbers. Writing JSON with such types would violate the spec. If you need | |
| 14 // something like this, either use a double or make a string value containing | |
| 15 // the number you want. | |
| 16 | |
| 17 #ifndef BASE_VALUES_H_ | |
| 18 #define BASE_VALUES_H_ | |
| 19 | |
| 20 #include <stddef.h> | |
| 21 | |
| 22 #include <iosfwd> | |
| 23 #include <map> | |
| 24 #include <string> | |
| 25 #include <utility> | |
| 26 #include <vector> | |
| 27 | |
| 28 #include "base/base_export.h" | |
| 29 #include "base/basictypes.h" | |
| 30 #include "base/compiler_specific.h" | |
| 31 #include "base/memory/scoped_ptr.h" | |
| 32 #include "base/strings/string16.h" | |
| 33 #include "base/strings/string_piece.h" | |
| 34 | |
| 35 namespace base { | |
| 36 | |
| 37 class BinaryValue; | |
| 38 class DictionaryValue; | |
| 39 class FundamentalValue; | |
| 40 class ListValue; | |
| 41 class StringValue; | |
| 42 class Value; | |
| 43 | |
| 44 typedef std::vector<Value*> ValueVector; | |
| 45 typedef std::map<std::string, Value*> ValueMap; | |
| 46 | |
| 47 // The Value class is the base class for Values. A Value can be instantiated | |
| 48 // via the Create*Value() factory methods, or by directly creating instances of | |
| 49 // the subclasses. | |
| 50 // | |
| 51 // See the file-level comment above for more information. | |
| 52 class BASE_EXPORT Value { | |
| 53 public: | |
| 54 enum Type { | |
| 55 TYPE_NULL = 0, | |
| 56 TYPE_BOOLEAN, | |
| 57 TYPE_INTEGER, | |
| 58 TYPE_DOUBLE, | |
| 59 TYPE_STRING, | |
| 60 TYPE_BINARY, | |
| 61 TYPE_DICTIONARY, | |
| 62 TYPE_LIST | |
| 63 // Note: Do not add more types. See the file-level comment above for why. | |
| 64 }; | |
| 65 | |
| 66 virtual ~Value(); | |
| 67 | |
| 68 static scoped_ptr<Value> CreateNullValue(); | |
| 69 | |
| 70 // Returns the type of the value stored by the current Value object. | |
| 71 // Each type will be implemented by only one subclass of Value, so it's | |
| 72 // safe to use the Type to determine whether you can cast from | |
| 73 // Value* to (Implementing Class)*. Also, a Value object never changes | |
| 74 // its type after construction. | |
| 75 Type GetType() const { return type_; } | |
| 76 | |
| 77 // Returns true if the current object represents a given type. | |
| 78 bool IsType(Type type) const { return type == type_; } | |
| 79 | |
| 80 // These methods allow the convenient retrieval of the contents of the Value. | |
| 81 // If the current object can be converted into the given type, the value is | |
| 82 // returned through the |out_value| parameter and true is returned; | |
| 83 // otherwise, false is returned and |out_value| is unchanged. | |
| 84 virtual bool GetAsBoolean(bool* out_value) const; | |
| 85 virtual bool GetAsInteger(int* out_value) const; | |
| 86 virtual bool GetAsDouble(double* out_value) const; | |
| 87 virtual bool GetAsString(std::string* out_value) const; | |
| 88 virtual bool GetAsString(string16* out_value) const; | |
| 89 virtual bool GetAsString(const StringValue** out_value) const; | |
| 90 virtual bool GetAsBinary(const BinaryValue** out_value) const; | |
| 91 virtual bool GetAsList(ListValue** out_value); | |
| 92 virtual bool GetAsList(const ListValue** out_value) const; | |
| 93 virtual bool GetAsDictionary(DictionaryValue** out_value); | |
| 94 virtual bool GetAsDictionary(const DictionaryValue** out_value) const; | |
| 95 // Note: Do not add more types. See the file-level comment above for why. | |
| 96 | |
| 97 // This creates a deep copy of the entire Value tree, and returns a pointer | |
| 98 // to the copy. The caller gets ownership of the copy, of course. | |
| 99 // | |
| 100 // Subclasses return their own type directly in their overrides; | |
| 101 // this works because C++ supports covariant return types. | |
| 102 virtual Value* DeepCopy() const; | |
| 103 // Preferred version of DeepCopy. TODO(estade): remove the above. | |
| 104 scoped_ptr<Value> CreateDeepCopy() const; | |
| 105 | |
| 106 // Compares if two Value objects have equal contents. | |
| 107 virtual bool Equals(const Value* other) const; | |
| 108 | |
| 109 // Compares if two Value objects have equal contents. Can handle NULLs. | |
| 110 // NULLs are considered equal but different from Value::CreateNullValue(). | |
| 111 static bool Equals(const Value* a, const Value* b); | |
| 112 | |
| 113 protected: | |
| 114 // These aren't safe for end-users, but they are useful for subclasses. | |
| 115 explicit Value(Type type); | |
| 116 Value(const Value& that); | |
| 117 Value& operator=(const Value& that); | |
| 118 | |
| 119 private: | |
| 120 Type type_; | |
| 121 }; | |
| 122 | |
| 123 // FundamentalValue represents the simple fundamental types of values. | |
| 124 class BASE_EXPORT FundamentalValue : public Value { | |
| 125 public: | |
| 126 explicit FundamentalValue(bool in_value); | |
| 127 explicit FundamentalValue(int in_value); | |
| 128 explicit FundamentalValue(double in_value); | |
| 129 ~FundamentalValue() override; | |
| 130 | |
| 131 // Overridden from Value: | |
| 132 bool GetAsBoolean(bool* out_value) const override; | |
| 133 bool GetAsInteger(int* out_value) const override; | |
| 134 // Values of both type TYPE_INTEGER and TYPE_DOUBLE can be obtained as | |
| 135 // doubles. | |
| 136 bool GetAsDouble(double* out_value) const override; | |
| 137 FundamentalValue* DeepCopy() const override; | |
| 138 bool Equals(const Value* other) const override; | |
| 139 | |
| 140 private: | |
| 141 union { | |
| 142 bool boolean_value_; | |
| 143 int integer_value_; | |
| 144 double double_value_; | |
| 145 }; | |
| 146 }; | |
| 147 | |
| 148 class BASE_EXPORT StringValue : public Value { | |
| 149 public: | |
| 150 // Initializes a StringValue with a UTF-8 narrow character string. | |
| 151 explicit StringValue(const std::string& in_value); | |
| 152 | |
| 153 // Initializes a StringValue with a string16. | |
| 154 explicit StringValue(const string16& in_value); | |
| 155 | |
| 156 ~StringValue() override; | |
| 157 | |
| 158 // Returns |value_| as a pointer or reference. | |
| 159 std::string* GetString(); | |
| 160 const std::string& GetString() const; | |
| 161 | |
| 162 // Overridden from Value: | |
| 163 bool GetAsString(std::string* out_value) const override; | |
| 164 bool GetAsString(string16* out_value) const override; | |
| 165 bool GetAsString(const StringValue** out_value) const override; | |
| 166 StringValue* DeepCopy() const override; | |
| 167 bool Equals(const Value* other) const override; | |
| 168 | |
| 169 private: | |
| 170 std::string value_; | |
| 171 }; | |
| 172 | |
| 173 class BASE_EXPORT BinaryValue: public Value { | |
| 174 public: | |
| 175 // Creates a BinaryValue with a null buffer and size of 0. | |
| 176 BinaryValue(); | |
| 177 | |
| 178 // Creates a BinaryValue, taking ownership of the bytes pointed to by | |
| 179 // |buffer|. | |
| 180 BinaryValue(scoped_ptr<char[]> buffer, size_t size); | |
| 181 | |
| 182 ~BinaryValue() override; | |
| 183 | |
| 184 // For situations where you want to keep ownership of your buffer, this | |
| 185 // factory method creates a new BinaryValue by copying the contents of the | |
| 186 // buffer that's passed in. | |
| 187 static BinaryValue* CreateWithCopiedBuffer(const char* buffer, size_t size); | |
| 188 | |
| 189 size_t GetSize() const { return size_; } | |
| 190 | |
| 191 // May return NULL. | |
| 192 char* GetBuffer() { return buffer_.get(); } | |
| 193 const char* GetBuffer() const { return buffer_.get(); } | |
| 194 | |
| 195 // Overridden from Value: | |
| 196 bool GetAsBinary(const BinaryValue** out_value) const override; | |
| 197 BinaryValue* DeepCopy() const override; | |
| 198 bool Equals(const Value* other) const override; | |
| 199 | |
| 200 private: | |
| 201 scoped_ptr<char[]> buffer_; | |
| 202 size_t size_; | |
| 203 | |
| 204 DISALLOW_COPY_AND_ASSIGN(BinaryValue); | |
| 205 }; | |
| 206 | |
| 207 // DictionaryValue provides a key-value dictionary with (optional) "path" | |
| 208 // parsing for recursive access; see the comment at the top of the file. Keys | |
| 209 // are |std::string|s and should be UTF-8 encoded. | |
| 210 class BASE_EXPORT DictionaryValue : public Value { | |
| 211 public: | |
| 212 DictionaryValue(); | |
| 213 ~DictionaryValue() override; | |
| 214 | |
| 215 // Overridden from Value: | |
| 216 bool GetAsDictionary(DictionaryValue** out_value) override; | |
| 217 bool GetAsDictionary(const DictionaryValue** out_value) const override; | |
| 218 | |
| 219 // Returns true if the current dictionary has a value for the given key. | |
| 220 bool HasKey(const std::string& key) const; | |
| 221 | |
| 222 // Returns the number of Values in this dictionary. | |
| 223 size_t size() const { return dictionary_.size(); } | |
| 224 | |
| 225 // Returns whether the dictionary is empty. | |
| 226 bool empty() const { return dictionary_.empty(); } | |
| 227 | |
| 228 // Clears any current contents of this dictionary. | |
| 229 void Clear(); | |
| 230 | |
| 231 // Sets the Value associated with the given path starting from this object. | |
| 232 // A path has the form "<key>" or "<key>.<key>.[...]", where "." indexes | |
| 233 // into the next DictionaryValue down. Obviously, "." can't be used | |
| 234 // within a key, but there are no other restrictions on keys. | |
| 235 // If the key at any step of the way doesn't exist, or exists but isn't | |
| 236 // a DictionaryValue, a new DictionaryValue will be created and attached | |
| 237 // to the path in that location. |in_value| must be non-null. | |
| 238 void Set(const std::string& path, scoped_ptr<Value> in_value); | |
| 239 // Deprecated version of the above. TODO(estade): remove. | |
| 240 void Set(const std::string& path, Value* in_value); | |
| 241 | |
| 242 // Convenience forms of Set(). These methods will replace any existing | |
| 243 // value at that path, even if it has a different type. | |
| 244 void SetBoolean(const std::string& path, bool in_value); | |
| 245 void SetInteger(const std::string& path, int in_value); | |
| 246 void SetDouble(const std::string& path, double in_value); | |
| 247 void SetString(const std::string& path, const std::string& in_value); | |
| 248 void SetString(const std::string& path, const string16& in_value); | |
| 249 | |
| 250 // Like Set(), but without special treatment of '.'. This allows e.g. URLs to | |
| 251 // be used as paths. | |
| 252 void SetWithoutPathExpansion(const std::string& key, | |
| 253 scoped_ptr<Value> in_value); | |
| 254 // Deprecated version of the above. TODO(estade): remove. | |
| 255 void SetWithoutPathExpansion(const std::string& key, Value* in_value); | |
| 256 | |
| 257 // Convenience forms of SetWithoutPathExpansion(). | |
| 258 void SetBooleanWithoutPathExpansion(const std::string& path, bool in_value); | |
| 259 void SetIntegerWithoutPathExpansion(const std::string& path, int in_value); | |
| 260 void SetDoubleWithoutPathExpansion(const std::string& path, double in_value); | |
| 261 void SetStringWithoutPathExpansion(const std::string& path, | |
| 262 const std::string& in_value); | |
| 263 void SetStringWithoutPathExpansion(const std::string& path, | |
| 264 const string16& in_value); | |
| 265 | |
| 266 // Gets the Value associated with the given path starting from this object. | |
| 267 // A path has the form "<key>" or "<key>.<key>.[...]", where "." indexes | |
| 268 // into the next DictionaryValue down. If the path can be resolved | |
| 269 // successfully, the value for the last key in the path will be returned | |
| 270 // through the |out_value| parameter, and the function will return true. | |
| 271 // Otherwise, it will return false and |out_value| will be untouched. | |
| 272 // Note that the dictionary always owns the value that's returned. | |
| 273 // |out_value| is optional and will only be set if non-NULL. | |
| 274 bool Get(StringPiece path, const Value** out_value) const; | |
| 275 bool Get(StringPiece path, Value** out_value); | |
| 276 | |
| 277 // These are convenience forms of Get(). The value will be retrieved | |
| 278 // and the return value will be true if the path is valid and the value at | |
| 279 // the end of the path can be returned in the form specified. | |
| 280 // |out_value| is optional and will only be set if non-NULL. | |
| 281 bool GetBoolean(const std::string& path, bool* out_value) const; | |
| 282 bool GetInteger(const std::string& path, int* out_value) const; | |
| 283 // Values of both type TYPE_INTEGER and TYPE_DOUBLE can be obtained as | |
| 284 // doubles. | |
| 285 bool GetDouble(const std::string& path, double* out_value) const; | |
| 286 bool GetString(const std::string& path, std::string* out_value) const; | |
| 287 bool GetString(const std::string& path, string16* out_value) const; | |
| 288 bool GetStringASCII(const std::string& path, std::string* out_value) const; | |
| 289 bool GetBinary(const std::string& path, const BinaryValue** out_value) const; | |
| 290 bool GetBinary(const std::string& path, BinaryValue** out_value); | |
| 291 bool GetDictionary(StringPiece path, const DictionaryValue** out_value) const; | |
| 292 bool GetDictionary(StringPiece path, DictionaryValue** out_value); | |
| 293 bool GetList(const std::string& path, const ListValue** out_value) const; | |
| 294 bool GetList(const std::string& path, ListValue** out_value); | |
| 295 | |
| 296 // Like Get(), but without special treatment of '.'. This allows e.g. URLs to | |
| 297 // be used as paths. | |
| 298 bool GetWithoutPathExpansion(const std::string& key, | |
| 299 const Value** out_value) const; | |
| 300 bool GetWithoutPathExpansion(const std::string& key, Value** out_value); | |
| 301 bool GetBooleanWithoutPathExpansion(const std::string& key, | |
| 302 bool* out_value) const; | |
| 303 bool GetIntegerWithoutPathExpansion(const std::string& key, | |
| 304 int* out_value) const; | |
| 305 bool GetDoubleWithoutPathExpansion(const std::string& key, | |
| 306 double* out_value) const; | |
| 307 bool GetStringWithoutPathExpansion(const std::string& key, | |
| 308 std::string* out_value) const; | |
| 309 bool GetStringWithoutPathExpansion(const std::string& key, | |
| 310 string16* out_value) const; | |
| 311 bool GetDictionaryWithoutPathExpansion( | |
| 312 const std::string& key, | |
| 313 const DictionaryValue** out_value) const; | |
| 314 bool GetDictionaryWithoutPathExpansion(const std::string& key, | |
| 315 DictionaryValue** out_value); | |
| 316 bool GetListWithoutPathExpansion(const std::string& key, | |
| 317 const ListValue** out_value) const; | |
| 318 bool GetListWithoutPathExpansion(const std::string& key, | |
| 319 ListValue** out_value); | |
| 320 | |
| 321 // Removes the Value with the specified path from this dictionary (or one | |
| 322 // of its child dictionaries, if the path is more than just a local key). | |
| 323 // If |out_value| is non-NULL, the removed Value will be passed out via | |
| 324 // |out_value|. If |out_value| is NULL, the removed value will be deleted. | |
| 325 // This method returns true if |path| is a valid path; otherwise it will | |
| 326 // return false and the DictionaryValue object will be unchanged. | |
| 327 virtual bool Remove(const std::string& path, scoped_ptr<Value>* out_value); | |
| 328 | |
| 329 // Like Remove(), but without special treatment of '.'. This allows e.g. URLs | |
| 330 // to be used as paths. | |
| 331 virtual bool RemoveWithoutPathExpansion(const std::string& key, | |
| 332 scoped_ptr<Value>* out_value); | |
| 333 | |
| 334 // Removes a path, clearing out all dictionaries on |path| that remain empty | |
| 335 // after removing the value at |path|. | |
| 336 virtual bool RemovePath(const std::string& path, | |
| 337 scoped_ptr<Value>* out_value); | |
| 338 | |
| 339 // Makes a copy of |this| but doesn't include empty dictionaries and lists in | |
| 340 // the copy. This never returns NULL, even if |this| itself is empty. | |
| 341 scoped_ptr<DictionaryValue> DeepCopyWithoutEmptyChildren() const; | |
| 342 | |
| 343 // Merge |dictionary| into this dictionary. This is done recursively, i.e. any | |
| 344 // sub-dictionaries will be merged as well. In case of key collisions, the | |
| 345 // passed in dictionary takes precedence and data already present will be | |
| 346 // replaced. Values within |dictionary| are deep-copied, so |dictionary| may | |
| 347 // be freed any time after this call. | |
| 348 void MergeDictionary(const DictionaryValue* dictionary); | |
| 349 | |
| 350 // Swaps contents with the |other| dictionary. | |
| 351 virtual void Swap(DictionaryValue* other); | |
| 352 | |
| 353 // This class provides an iterator over both keys and values in the | |
| 354 // dictionary. It can't be used to modify the dictionary. | |
| 355 class BASE_EXPORT Iterator { | |
| 356 public: | |
| 357 explicit Iterator(const DictionaryValue& target); | |
| 358 ~Iterator(); | |
| 359 | |
| 360 bool IsAtEnd() const { return it_ == target_.dictionary_.end(); } | |
| 361 void Advance() { ++it_; } | |
| 362 | |
| 363 const std::string& key() const { return it_->first; } | |
| 364 const Value& value() const { return *it_->second; } | |
| 365 | |
| 366 private: | |
| 367 const DictionaryValue& target_; | |
| 368 ValueMap::const_iterator it_; | |
| 369 }; | |
| 370 | |
| 371 // Overridden from Value: | |
| 372 DictionaryValue* DeepCopy() const override; | |
| 373 // Preferred version of DeepCopy. TODO(estade): remove the above. | |
| 374 scoped_ptr<DictionaryValue> CreateDeepCopy() const; | |
| 375 bool Equals(const Value* other) const override; | |
| 376 | |
| 377 private: | |
| 378 ValueMap dictionary_; | |
| 379 | |
| 380 DISALLOW_COPY_AND_ASSIGN(DictionaryValue); | |
| 381 }; | |
| 382 | |
| 383 // This type of Value represents a list of other Value values. | |
| 384 class BASE_EXPORT ListValue : public Value { | |
| 385 public: | |
| 386 typedef ValueVector::iterator iterator; | |
| 387 typedef ValueVector::const_iterator const_iterator; | |
| 388 | |
| 389 ListValue(); | |
| 390 ~ListValue() override; | |
| 391 | |
| 392 // Clears the contents of this ListValue | |
| 393 void Clear(); | |
| 394 | |
| 395 // Returns the number of Values in this list. | |
| 396 size_t GetSize() const { return list_.size(); } | |
| 397 | |
| 398 // Returns whether the list is empty. | |
| 399 bool empty() const { return list_.empty(); } | |
| 400 | |
| 401 // Sets the list item at the given index to be the Value specified by | |
| 402 // the value given. If the index beyond the current end of the list, null | |
| 403 // Values will be used to pad out the list. | |
| 404 // Returns true if successful, or false if the index was negative or | |
| 405 // the value is a null pointer. | |
| 406 bool Set(size_t index, Value* in_value); | |
| 407 // Preferred version of the above. TODO(estade): remove the above. | |
| 408 bool Set(size_t index, scoped_ptr<Value> in_value); | |
| 409 | |
| 410 // Gets the Value at the given index. Modifies |out_value| (and returns true) | |
| 411 // only if the index falls within the current list range. | |
| 412 // Note that the list always owns the Value passed out via |out_value|. | |
| 413 // |out_value| is optional and will only be set if non-NULL. | |
| 414 bool Get(size_t index, const Value** out_value) const; | |
| 415 bool Get(size_t index, Value** out_value); | |
| 416 | |
| 417 // Convenience forms of Get(). Modifies |out_value| (and returns true) | |
| 418 // only if the index is valid and the Value at that index can be returned | |
| 419 // in the specified form. | |
| 420 // |out_value| is optional and will only be set if non-NULL. | |
| 421 bool GetBoolean(size_t index, bool* out_value) const; | |
| 422 bool GetInteger(size_t index, int* out_value) const; | |
| 423 // Values of both type TYPE_INTEGER and TYPE_DOUBLE can be obtained as | |
| 424 // doubles. | |
| 425 bool GetDouble(size_t index, double* out_value) const; | |
| 426 bool GetString(size_t index, std::string* out_value) const; | |
| 427 bool GetString(size_t index, string16* out_value) const; | |
| 428 bool GetBinary(size_t index, const BinaryValue** out_value) const; | |
| 429 bool GetBinary(size_t index, BinaryValue** out_value); | |
| 430 bool GetDictionary(size_t index, const DictionaryValue** out_value) const; | |
| 431 bool GetDictionary(size_t index, DictionaryValue** out_value); | |
| 432 bool GetList(size_t index, const ListValue** out_value) const; | |
| 433 bool GetList(size_t index, ListValue** out_value); | |
| 434 | |
| 435 // Removes the Value with the specified index from this list. | |
| 436 // If |out_value| is non-NULL, the removed Value AND ITS OWNERSHIP will be | |
| 437 // passed out via |out_value|. If |out_value| is NULL, the removed value will | |
| 438 // be deleted. This method returns true if |index| is valid; otherwise | |
| 439 // it will return false and the ListValue object will be unchanged. | |
| 440 virtual bool Remove(size_t index, scoped_ptr<Value>* out_value); | |
| 441 | |
| 442 // Removes the first instance of |value| found in the list, if any, and | |
| 443 // deletes it. |index| is the location where |value| was found. Returns false | |
| 444 // if not found. | |
| 445 bool Remove(const Value& value, size_t* index); | |
| 446 | |
| 447 // Removes the element at |iter|. If |out_value| is NULL, the value will be | |
| 448 // deleted, otherwise ownership of the value is passed back to the caller. | |
| 449 // Returns an iterator pointing to the location of the element that | |
| 450 // followed the erased element. | |
| 451 iterator Erase(iterator iter, scoped_ptr<Value>* out_value); | |
| 452 | |
| 453 // Appends a Value to the end of the list. | |
| 454 void Append(scoped_ptr<Value> in_value); | |
| 455 // Deprecated version of the above. TODO(estade): remove. | |
| 456 void Append(Value* in_value); | |
| 457 | |
| 458 // Convenience forms of Append. | |
| 459 void AppendBoolean(bool in_value); | |
| 460 void AppendInteger(int in_value); | |
| 461 void AppendDouble(double in_value); | |
| 462 void AppendString(const std::string& in_value); | |
| 463 void AppendString(const string16& in_value); | |
| 464 void AppendStrings(const std::vector<std::string>& in_values); | |
| 465 void AppendStrings(const std::vector<string16>& in_values); | |
| 466 | |
| 467 // Appends a Value if it's not already present. Takes ownership of the | |
| 468 // |in_value|. Returns true if successful, or false if the value was already | |
| 469 // present. If the value was already present the |in_value| is deleted. | |
| 470 bool AppendIfNotPresent(Value* in_value); | |
| 471 | |
| 472 // Insert a Value at index. | |
| 473 // Returns true if successful, or false if the index was out of range. | |
| 474 bool Insert(size_t index, Value* in_value); | |
| 475 | |
| 476 // Searches for the first instance of |value| in the list using the Equals | |
| 477 // method of the Value type. | |
| 478 // Returns a const_iterator to the found item or to end() if none exists. | |
| 479 const_iterator Find(const Value& value) const; | |
| 480 | |
| 481 // Swaps contents with the |other| list. | |
| 482 virtual void Swap(ListValue* other); | |
| 483 | |
| 484 // Iteration. | |
| 485 iterator begin() { return list_.begin(); } | |
| 486 iterator end() { return list_.end(); } | |
| 487 | |
| 488 const_iterator begin() const { return list_.begin(); } | |
| 489 const_iterator end() const { return list_.end(); } | |
| 490 | |
| 491 // Overridden from Value: | |
| 492 bool GetAsList(ListValue** out_value) override; | |
| 493 bool GetAsList(const ListValue** out_value) const override; | |
| 494 ListValue* DeepCopy() const override; | |
| 495 bool Equals(const Value* other) const override; | |
| 496 | |
| 497 // Preferred version of DeepCopy. TODO(estade): remove DeepCopy. | |
| 498 scoped_ptr<ListValue> CreateDeepCopy() const; | |
| 499 | |
| 500 private: | |
| 501 ValueVector list_; | |
| 502 | |
| 503 DISALLOW_COPY_AND_ASSIGN(ListValue); | |
| 504 }; | |
| 505 | |
| 506 // This interface is implemented by classes that know how to serialize | |
| 507 // Value objects. | |
| 508 class BASE_EXPORT ValueSerializer { | |
| 509 public: | |
| 510 virtual ~ValueSerializer(); | |
| 511 | |
| 512 virtual bool Serialize(const Value& root) = 0; | |
| 513 }; | |
| 514 | |
| 515 // This interface is implemented by classes that know how to deserialize Value | |
| 516 // objects. | |
| 517 class BASE_EXPORT ValueDeserializer { | |
| 518 public: | |
| 519 virtual ~ValueDeserializer(); | |
| 520 | |
| 521 // This method deserializes the subclass-specific format into a Value object. | |
| 522 // If the return value is non-NULL, the caller takes ownership of returned | |
| 523 // Value. If the return value is NULL, and if error_code is non-NULL, | |
| 524 // error_code will be set with the underlying error. | |
| 525 // If |error_message| is non-null, it will be filled in with a formatted | |
| 526 // error message including the location of the error if appropriate. | |
| 527 virtual Value* Deserialize(int* error_code, std::string* error_str) = 0; | |
| 528 }; | |
| 529 | |
| 530 // Stream operator so Values can be used in assertion statements. In order that | |
| 531 // gtest uses this operator to print readable output on test failures, we must | |
| 532 // override each specific type. Otherwise, the default template implementation | |
| 533 // is preferred over an upcast. | |
| 534 BASE_EXPORT std::ostream& operator<<(std::ostream& out, const Value& value); | |
| 535 | |
| 536 BASE_EXPORT inline std::ostream& operator<<(std::ostream& out, | |
| 537 const FundamentalValue& value) { | |
| 538 return out << static_cast<const Value&>(value); | |
| 539 } | |
| 540 | |
| 541 BASE_EXPORT inline std::ostream& operator<<(std::ostream& out, | |
| 542 const StringValue& value) { | |
| 543 return out << static_cast<const Value&>(value); | |
| 544 } | |
| 545 | |
| 546 BASE_EXPORT inline std::ostream& operator<<(std::ostream& out, | |
| 547 const DictionaryValue& value) { | |
| 548 return out << static_cast<const Value&>(value); | |
| 549 } | |
| 550 | |
| 551 BASE_EXPORT inline std::ostream& operator<<(std::ostream& out, | |
| 552 const ListValue& value) { | |
| 553 return out << static_cast<const Value&>(value); | |
| 554 } | |
| 555 | |
| 556 } // namespace base | |
| 557 | |
| 558 #endif // BASE_VALUES_H_ | |
| OLD | NEW |