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 // This file specifies a recursive data storage class called Value intended for | 5 // This file specifies a recursive data storage class called Value intended for |
6 // storing settings and other persistable data. | 6 // storing settings and other persistable data. |
7 // | 7 // |
8 // A Value represents something that can be stored in JSON or passed to/from | 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 | 9 // JavaScript. As such, it is NOT a generalized variant type, since only the |
10 // types supported by JavaScript/JSON are supported. | 10 // types supported by JavaScript/JSON are supported. |
11 // | 11 // |
12 // IN PARTICULAR this means that there is no support for int64_t or unsigned | 12 // IN PARTICULAR this means that there is no support for int64_t or unsigned |
13 // numbers. Writing JSON with such types would violate the spec. If you need | 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 | 14 // something like this, either use a double or make a string value containing |
15 // the number you want. | 15 // the number you want. |
16 | 16 |
17 #ifndef BASE_VALUES_H_ | 17 #ifndef BASE_VALUES_H_ |
18 #define BASE_VALUES_H_ | 18 #define BASE_VALUES_H_ |
19 | 19 |
20 #include <stddef.h> | 20 #include <stddef.h> |
21 #include <stdint.h> | 21 #include <stdint.h> |
22 | 22 |
23 #include <iosfwd> | 23 #include <iosfwd> |
24 #include <map> | 24 #include <map> |
| 25 #include <memory> |
25 #include <string> | 26 #include <string> |
26 #include <utility> | 27 #include <utility> |
27 #include <vector> | 28 #include <vector> |
28 | 29 |
29 #include "base/base_export.h" | 30 #include "base/base_export.h" |
30 #include "base/compiler_specific.h" | 31 #include "base/compiler_specific.h" |
31 #include "base/macros.h" | 32 #include "base/macros.h" |
32 #include "base/memory/scoped_ptr.h" | |
33 #include "base/strings/string16.h" | 33 #include "base/strings/string16.h" |
34 #include "base/strings/string_piece.h" | 34 #include "base/strings/string_piece.h" |
35 | 35 |
36 namespace base { | 36 namespace base { |
37 | 37 |
38 class BinaryValue; | 38 class BinaryValue; |
39 class DictionaryValue; | 39 class DictionaryValue; |
40 class FundamentalValue; | 40 class FundamentalValue; |
41 class ListValue; | 41 class ListValue; |
42 class StringValue; | 42 class StringValue; |
(...skipping 16 matching lines...) Expand all Loading... |
59 TYPE_DOUBLE, | 59 TYPE_DOUBLE, |
60 TYPE_STRING, | 60 TYPE_STRING, |
61 TYPE_BINARY, | 61 TYPE_BINARY, |
62 TYPE_DICTIONARY, | 62 TYPE_DICTIONARY, |
63 TYPE_LIST | 63 TYPE_LIST |
64 // Note: Do not add more types. See the file-level comment above for why. | 64 // Note: Do not add more types. See the file-level comment above for why. |
65 }; | 65 }; |
66 | 66 |
67 virtual ~Value(); | 67 virtual ~Value(); |
68 | 68 |
69 static scoped_ptr<Value> CreateNullValue(); | 69 static std::unique_ptr<Value> CreateNullValue(); |
70 | 70 |
71 // Returns the type of the value stored by the current Value object. | 71 // Returns the type of the value stored by the current Value object. |
72 // Each type will be implemented by only one subclass of Value, so it's | 72 // Each type will be implemented by only one subclass of Value, so it's |
73 // safe to use the Type to determine whether you can cast from | 73 // safe to use the Type to determine whether you can cast from |
74 // Value* to (Implementing Class)*. Also, a Value object never changes | 74 // Value* to (Implementing Class)*. Also, a Value object never changes |
75 // its type after construction. | 75 // its type after construction. |
76 Type GetType() const { return type_; } | 76 Type GetType() const { return type_; } |
77 | 77 |
78 // Returns true if the current object represents a given type. | 78 // Returns true if the current object represents a given type. |
79 bool IsType(Type type) const { return type == type_; } | 79 bool IsType(Type type) const { return type == type_; } |
(...skipping 15 matching lines...) Expand all Loading... |
95 virtual bool GetAsDictionary(const DictionaryValue** out_value) const; | 95 virtual bool GetAsDictionary(const DictionaryValue** out_value) const; |
96 // Note: Do not add more types. See the file-level comment above for why. | 96 // Note: Do not add more types. See the file-level comment above for why. |
97 | 97 |
98 // This creates a deep copy of the entire Value tree, and returns a pointer | 98 // This creates a deep copy of the entire Value tree, and returns a pointer |
99 // to the copy. The caller gets ownership of the copy, of course. | 99 // to the copy. The caller gets ownership of the copy, of course. |
100 // | 100 // |
101 // Subclasses return their own type directly in their overrides; | 101 // Subclasses return their own type directly in their overrides; |
102 // this works because C++ supports covariant return types. | 102 // this works because C++ supports covariant return types. |
103 virtual Value* DeepCopy() const; | 103 virtual Value* DeepCopy() const; |
104 // Preferred version of DeepCopy. TODO(estade): remove the above. | 104 // Preferred version of DeepCopy. TODO(estade): remove the above. |
105 scoped_ptr<Value> CreateDeepCopy() const; | 105 std::unique_ptr<Value> CreateDeepCopy() const; |
106 | 106 |
107 // Compares if two Value objects have equal contents. | 107 // Compares if two Value objects have equal contents. |
108 virtual bool Equals(const Value* other) const; | 108 virtual bool Equals(const Value* other) const; |
109 | 109 |
110 // Compares if two Value objects have equal contents. Can handle NULLs. | 110 // Compares if two Value objects have equal contents. Can handle NULLs. |
111 // NULLs are considered equal but different from Value::CreateNullValue(). | 111 // NULLs are considered equal but different from Value::CreateNullValue(). |
112 static bool Equals(const Value* a, const Value* b); | 112 static bool Equals(const Value* a, const Value* b); |
113 | 113 |
114 protected: | 114 protected: |
115 // These aren't safe for end-users, but they are useful for subclasses. | 115 // These aren't safe for end-users, but they are useful for subclasses. |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 std::string value_; | 171 std::string value_; |
172 }; | 172 }; |
173 | 173 |
174 class BASE_EXPORT BinaryValue: public Value { | 174 class BASE_EXPORT BinaryValue: public Value { |
175 public: | 175 public: |
176 // Creates a BinaryValue with a null buffer and size of 0. | 176 // Creates a BinaryValue with a null buffer and size of 0. |
177 BinaryValue(); | 177 BinaryValue(); |
178 | 178 |
179 // Creates a BinaryValue, taking ownership of the bytes pointed to by | 179 // Creates a BinaryValue, taking ownership of the bytes pointed to by |
180 // |buffer|. | 180 // |buffer|. |
181 BinaryValue(scoped_ptr<char[]> buffer, size_t size); | 181 BinaryValue(std::unique_ptr<char[]> buffer, size_t size); |
182 | 182 |
183 ~BinaryValue() override; | 183 ~BinaryValue() override; |
184 | 184 |
185 // For situations where you want to keep ownership of your buffer, this | 185 // For situations where you want to keep ownership of your buffer, this |
186 // factory method creates a new BinaryValue by copying the contents of the | 186 // factory method creates a new BinaryValue by copying the contents of the |
187 // buffer that's passed in. | 187 // buffer that's passed in. |
188 static BinaryValue* CreateWithCopiedBuffer(const char* buffer, size_t size); | 188 static BinaryValue* CreateWithCopiedBuffer(const char* buffer, size_t size); |
189 | 189 |
190 size_t GetSize() const { return size_; } | 190 size_t GetSize() const { return size_; } |
191 | 191 |
192 // May return NULL. | 192 // May return NULL. |
193 char* GetBuffer() { return buffer_.get(); } | 193 char* GetBuffer() { return buffer_.get(); } |
194 const char* GetBuffer() const { return buffer_.get(); } | 194 const char* GetBuffer() const { return buffer_.get(); } |
195 | 195 |
196 // Overridden from Value: | 196 // Overridden from Value: |
197 bool GetAsBinary(const BinaryValue** out_value) const override; | 197 bool GetAsBinary(const BinaryValue** out_value) const override; |
198 BinaryValue* DeepCopy() const override; | 198 BinaryValue* DeepCopy() const override; |
199 bool Equals(const Value* other) const override; | 199 bool Equals(const Value* other) const override; |
200 | 200 |
201 private: | 201 private: |
202 scoped_ptr<char[]> buffer_; | 202 std::unique_ptr<char[]> buffer_; |
203 size_t size_; | 203 size_t size_; |
204 | 204 |
205 DISALLOW_COPY_AND_ASSIGN(BinaryValue); | 205 DISALLOW_COPY_AND_ASSIGN(BinaryValue); |
206 }; | 206 }; |
207 | 207 |
208 // DictionaryValue provides a key-value dictionary with (optional) "path" | 208 // DictionaryValue provides a key-value dictionary with (optional) "path" |
209 // parsing for recursive access; see the comment at the top of the file. Keys | 209 // parsing for recursive access; see the comment at the top of the file. Keys |
210 // are |std::string|s and should be UTF-8 encoded. | 210 // are |std::string|s and should be UTF-8 encoded. |
211 class BASE_EXPORT DictionaryValue : public Value { | 211 class BASE_EXPORT DictionaryValue : public Value { |
212 public: | 212 public: |
213 // Returns |value| if it is a dictionary, nullptr otherwise. | 213 // Returns |value| if it is a dictionary, nullptr otherwise. |
214 static scoped_ptr<DictionaryValue> From(scoped_ptr<Value> value); | 214 static std::unique_ptr<DictionaryValue> From(std::unique_ptr<Value> value); |
215 | 215 |
216 DictionaryValue(); | 216 DictionaryValue(); |
217 ~DictionaryValue() override; | 217 ~DictionaryValue() override; |
218 | 218 |
219 // Overridden from Value: | 219 // Overridden from Value: |
220 bool GetAsDictionary(DictionaryValue** out_value) override; | 220 bool GetAsDictionary(DictionaryValue** out_value) override; |
221 bool GetAsDictionary(const DictionaryValue** out_value) const override; | 221 bool GetAsDictionary(const DictionaryValue** out_value) const override; |
222 | 222 |
223 // Returns true if the current dictionary has a value for the given key. | 223 // Returns true if the current dictionary has a value for the given key. |
224 bool HasKey(const std::string& key) const; | 224 bool HasKey(const std::string& key) const; |
225 | 225 |
226 // Returns the number of Values in this dictionary. | 226 // Returns the number of Values in this dictionary. |
227 size_t size() const { return dictionary_.size(); } | 227 size_t size() const { return dictionary_.size(); } |
228 | 228 |
229 // Returns whether the dictionary is empty. | 229 // Returns whether the dictionary is empty. |
230 bool empty() const { return dictionary_.empty(); } | 230 bool empty() const { return dictionary_.empty(); } |
231 | 231 |
232 // Clears any current contents of this dictionary. | 232 // Clears any current contents of this dictionary. |
233 void Clear(); | 233 void Clear(); |
234 | 234 |
235 // Sets the Value associated with the given path starting from this object. | 235 // Sets the Value associated with the given path starting from this object. |
236 // A path has the form "<key>" or "<key>.<key>.[...]", where "." indexes | 236 // A path has the form "<key>" or "<key>.<key>.[...]", where "." indexes |
237 // into the next DictionaryValue down. Obviously, "." can't be used | 237 // into the next DictionaryValue down. Obviously, "." can't be used |
238 // within a key, but there are no other restrictions on keys. | 238 // within a key, but there are no other restrictions on keys. |
239 // If the key at any step of the way doesn't exist, or exists but isn't | 239 // If the key at any step of the way doesn't exist, or exists but isn't |
240 // a DictionaryValue, a new DictionaryValue will be created and attached | 240 // a DictionaryValue, a new DictionaryValue will be created and attached |
241 // to the path in that location. |in_value| must be non-null. | 241 // to the path in that location. |in_value| must be non-null. |
242 void Set(const std::string& path, scoped_ptr<Value> in_value); | 242 void Set(const std::string& path, std::unique_ptr<Value> in_value); |
243 // Deprecated version of the above. TODO(estade): remove. | 243 // Deprecated version of the above. TODO(estade): remove. |
244 void Set(const std::string& path, Value* in_value); | 244 void Set(const std::string& path, Value* in_value); |
245 | 245 |
246 // Convenience forms of Set(). These methods will replace any existing | 246 // Convenience forms of Set(). These methods will replace any existing |
247 // value at that path, even if it has a different type. | 247 // value at that path, even if it has a different type. |
248 void SetBoolean(const std::string& path, bool in_value); | 248 void SetBoolean(const std::string& path, bool in_value); |
249 void SetInteger(const std::string& path, int in_value); | 249 void SetInteger(const std::string& path, int in_value); |
250 void SetDouble(const std::string& path, double in_value); | 250 void SetDouble(const std::string& path, double in_value); |
251 void SetString(const std::string& path, const std::string& in_value); | 251 void SetString(const std::string& path, const std::string& in_value); |
252 void SetString(const std::string& path, const string16& in_value); | 252 void SetString(const std::string& path, const string16& in_value); |
253 | 253 |
254 // Like Set(), but without special treatment of '.'. This allows e.g. URLs to | 254 // Like Set(), but without special treatment of '.'. This allows e.g. URLs to |
255 // be used as paths. | 255 // be used as paths. |
256 void SetWithoutPathExpansion(const std::string& key, | 256 void SetWithoutPathExpansion(const std::string& key, |
257 scoped_ptr<Value> in_value); | 257 std::unique_ptr<Value> in_value); |
258 // Deprecated version of the above. TODO(estade): remove. | 258 // Deprecated version of the above. TODO(estade): remove. |
259 void SetWithoutPathExpansion(const std::string& key, Value* in_value); | 259 void SetWithoutPathExpansion(const std::string& key, Value* in_value); |
260 | 260 |
261 // Convenience forms of SetWithoutPathExpansion(). | 261 // Convenience forms of SetWithoutPathExpansion(). |
262 void SetBooleanWithoutPathExpansion(const std::string& path, bool in_value); | 262 void SetBooleanWithoutPathExpansion(const std::string& path, bool in_value); |
263 void SetIntegerWithoutPathExpansion(const std::string& path, int in_value); | 263 void SetIntegerWithoutPathExpansion(const std::string& path, int in_value); |
264 void SetDoubleWithoutPathExpansion(const std::string& path, double in_value); | 264 void SetDoubleWithoutPathExpansion(const std::string& path, double in_value); |
265 void SetStringWithoutPathExpansion(const std::string& path, | 265 void SetStringWithoutPathExpansion(const std::string& path, |
266 const std::string& in_value); | 266 const std::string& in_value); |
267 void SetStringWithoutPathExpansion(const std::string& path, | 267 void SetStringWithoutPathExpansion(const std::string& path, |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 const ListValue** out_value) const; | 322 const ListValue** out_value) const; |
323 bool GetListWithoutPathExpansion(const std::string& key, | 323 bool GetListWithoutPathExpansion(const std::string& key, |
324 ListValue** out_value); | 324 ListValue** out_value); |
325 | 325 |
326 // Removes the Value with the specified path from this dictionary (or one | 326 // Removes the Value with the specified path from this dictionary (or one |
327 // of its child dictionaries, if the path is more than just a local key). | 327 // of its child dictionaries, if the path is more than just a local key). |
328 // If |out_value| is non-NULL, the removed Value will be passed out via | 328 // If |out_value| is non-NULL, the removed Value will be passed out via |
329 // |out_value|. If |out_value| is NULL, the removed value will be deleted. | 329 // |out_value|. If |out_value| is NULL, the removed value will be deleted. |
330 // This method returns true if |path| is a valid path; otherwise it will | 330 // This method returns true if |path| is a valid path; otherwise it will |
331 // return false and the DictionaryValue object will be unchanged. | 331 // return false and the DictionaryValue object will be unchanged. |
332 virtual bool Remove(const std::string& path, scoped_ptr<Value>* out_value); | 332 virtual bool Remove(const std::string& path, |
| 333 std::unique_ptr<Value>* out_value); |
333 | 334 |
334 // Like Remove(), but without special treatment of '.'. This allows e.g. URLs | 335 // Like Remove(), but without special treatment of '.'. This allows e.g. URLs |
335 // to be used as paths. | 336 // to be used as paths. |
336 virtual bool RemoveWithoutPathExpansion(const std::string& key, | 337 virtual bool RemoveWithoutPathExpansion(const std::string& key, |
337 scoped_ptr<Value>* out_value); | 338 std::unique_ptr<Value>* out_value); |
338 | 339 |
339 // Removes a path, clearing out all dictionaries on |path| that remain empty | 340 // Removes a path, clearing out all dictionaries on |path| that remain empty |
340 // after removing the value at |path|. | 341 // after removing the value at |path|. |
341 virtual bool RemovePath(const std::string& path, | 342 virtual bool RemovePath(const std::string& path, |
342 scoped_ptr<Value>* out_value); | 343 std::unique_ptr<Value>* out_value); |
343 | 344 |
344 // Makes a copy of |this| but doesn't include empty dictionaries and lists in | 345 // Makes a copy of |this| but doesn't include empty dictionaries and lists in |
345 // the copy. This never returns NULL, even if |this| itself is empty. | 346 // the copy. This never returns NULL, even if |this| itself is empty. |
346 scoped_ptr<DictionaryValue> DeepCopyWithoutEmptyChildren() const; | 347 std::unique_ptr<DictionaryValue> DeepCopyWithoutEmptyChildren() const; |
347 | 348 |
348 // Merge |dictionary| into this dictionary. This is done recursively, i.e. any | 349 // Merge |dictionary| into this dictionary. This is done recursively, i.e. any |
349 // sub-dictionaries will be merged as well. In case of key collisions, the | 350 // sub-dictionaries will be merged as well. In case of key collisions, the |
350 // passed in dictionary takes precedence and data already present will be | 351 // passed in dictionary takes precedence and data already present will be |
351 // replaced. Values within |dictionary| are deep-copied, so |dictionary| may | 352 // replaced. Values within |dictionary| are deep-copied, so |dictionary| may |
352 // be freed any time after this call. | 353 // be freed any time after this call. |
353 void MergeDictionary(const DictionaryValue* dictionary); | 354 void MergeDictionary(const DictionaryValue* dictionary); |
354 | 355 |
355 // Swaps contents with the |other| dictionary. | 356 // Swaps contents with the |other| dictionary. |
356 virtual void Swap(DictionaryValue* other); | 357 virtual void Swap(DictionaryValue* other); |
(...skipping 13 matching lines...) Expand all Loading... |
370 const Value& value() const { return *it_->second; } | 371 const Value& value() const { return *it_->second; } |
371 | 372 |
372 private: | 373 private: |
373 const DictionaryValue& target_; | 374 const DictionaryValue& target_; |
374 ValueMap::const_iterator it_; | 375 ValueMap::const_iterator it_; |
375 }; | 376 }; |
376 | 377 |
377 // Overridden from Value: | 378 // Overridden from Value: |
378 DictionaryValue* DeepCopy() const override; | 379 DictionaryValue* DeepCopy() const override; |
379 // Preferred version of DeepCopy. TODO(estade): remove the above. | 380 // Preferred version of DeepCopy. TODO(estade): remove the above. |
380 scoped_ptr<DictionaryValue> CreateDeepCopy() const; | 381 std::unique_ptr<DictionaryValue> CreateDeepCopy() const; |
381 bool Equals(const Value* other) const override; | 382 bool Equals(const Value* other) const override; |
382 | 383 |
383 private: | 384 private: |
384 ValueMap dictionary_; | 385 ValueMap dictionary_; |
385 | 386 |
386 DISALLOW_COPY_AND_ASSIGN(DictionaryValue); | 387 DISALLOW_COPY_AND_ASSIGN(DictionaryValue); |
387 }; | 388 }; |
388 | 389 |
389 // This type of Value represents a list of other Value values. | 390 // This type of Value represents a list of other Value values. |
390 class BASE_EXPORT ListValue : public Value { | 391 class BASE_EXPORT ListValue : public Value { |
391 public: | 392 public: |
392 typedef ValueVector::iterator iterator; | 393 typedef ValueVector::iterator iterator; |
393 typedef ValueVector::const_iterator const_iterator; | 394 typedef ValueVector::const_iterator const_iterator; |
394 | 395 |
395 // Returns |value| if it is a list, nullptr otherwise. | 396 // Returns |value| if it is a list, nullptr otherwise. |
396 static scoped_ptr<ListValue> From(scoped_ptr<Value> value); | 397 static std::unique_ptr<ListValue> From(std::unique_ptr<Value> value); |
397 | 398 |
398 ListValue(); | 399 ListValue(); |
399 ~ListValue() override; | 400 ~ListValue() override; |
400 | 401 |
401 // Clears the contents of this ListValue | 402 // Clears the contents of this ListValue |
402 void Clear(); | 403 void Clear(); |
403 | 404 |
404 // Returns the number of Values in this list. | 405 // Returns the number of Values in this list. |
405 size_t GetSize() const { return list_.size(); } | 406 size_t GetSize() const { return list_.size(); } |
406 | 407 |
407 // Returns whether the list is empty. | 408 // Returns whether the list is empty. |
408 bool empty() const { return list_.empty(); } | 409 bool empty() const { return list_.empty(); } |
409 | 410 |
410 // Sets the list item at the given index to be the Value specified by | 411 // Sets the list item at the given index to be the Value specified by |
411 // the value given. If the index beyond the current end of the list, null | 412 // the value given. If the index beyond the current end of the list, null |
412 // Values will be used to pad out the list. | 413 // Values will be used to pad out the list. |
413 // Returns true if successful, or false if the index was negative or | 414 // Returns true if successful, or false if the index was negative or |
414 // the value is a null pointer. | 415 // the value is a null pointer. |
415 bool Set(size_t index, Value* in_value); | 416 bool Set(size_t index, Value* in_value); |
416 // Preferred version of the above. TODO(estade): remove the above. | 417 // Preferred version of the above. TODO(estade): remove the above. |
417 bool Set(size_t index, scoped_ptr<Value> in_value); | 418 bool Set(size_t index, std::unique_ptr<Value> in_value); |
418 | 419 |
419 // Gets the Value at the given index. Modifies |out_value| (and returns true) | 420 // Gets the Value at the given index. Modifies |out_value| (and returns true) |
420 // only if the index falls within the current list range. | 421 // only if the index falls within the current list range. |
421 // Note that the list always owns the Value passed out via |out_value|. | 422 // Note that the list always owns the Value passed out via |out_value|. |
422 // |out_value| is optional and will only be set if non-NULL. | 423 // |out_value| is optional and will only be set if non-NULL. |
423 bool Get(size_t index, const Value** out_value) const; | 424 bool Get(size_t index, const Value** out_value) const; |
424 bool Get(size_t index, Value** out_value); | 425 bool Get(size_t index, Value** out_value); |
425 | 426 |
426 // Convenience forms of Get(). Modifies |out_value| (and returns true) | 427 // Convenience forms of Get(). Modifies |out_value| (and returns true) |
427 // only if the index is valid and the Value at that index can be returned | 428 // only if the index is valid and the Value at that index can be returned |
(...skipping 11 matching lines...) Expand all Loading... |
439 bool GetDictionary(size_t index, const DictionaryValue** out_value) const; | 440 bool GetDictionary(size_t index, const DictionaryValue** out_value) const; |
440 bool GetDictionary(size_t index, DictionaryValue** out_value); | 441 bool GetDictionary(size_t index, DictionaryValue** out_value); |
441 bool GetList(size_t index, const ListValue** out_value) const; | 442 bool GetList(size_t index, const ListValue** out_value) const; |
442 bool GetList(size_t index, ListValue** out_value); | 443 bool GetList(size_t index, ListValue** out_value); |
443 | 444 |
444 // Removes the Value with the specified index from this list. | 445 // Removes the Value with the specified index from this list. |
445 // If |out_value| is non-NULL, the removed Value AND ITS OWNERSHIP will be | 446 // If |out_value| is non-NULL, the removed Value AND ITS OWNERSHIP will be |
446 // passed out via |out_value|. If |out_value| is NULL, the removed value will | 447 // passed out via |out_value|. If |out_value| is NULL, the removed value will |
447 // be deleted. This method returns true if |index| is valid; otherwise | 448 // be deleted. This method returns true if |index| is valid; otherwise |
448 // it will return false and the ListValue object will be unchanged. | 449 // it will return false and the ListValue object will be unchanged. |
449 virtual bool Remove(size_t index, scoped_ptr<Value>* out_value); | 450 virtual bool Remove(size_t index, std::unique_ptr<Value>* out_value); |
450 | 451 |
451 // Removes the first instance of |value| found in the list, if any, and | 452 // Removes the first instance of |value| found in the list, if any, and |
452 // deletes it. |index| is the location where |value| was found. Returns false | 453 // deletes it. |index| is the location where |value| was found. Returns false |
453 // if not found. | 454 // if not found. |
454 bool Remove(const Value& value, size_t* index); | 455 bool Remove(const Value& value, size_t* index); |
455 | 456 |
456 // Removes the element at |iter|. If |out_value| is NULL, the value will be | 457 // Removes the element at |iter|. If |out_value| is NULL, the value will be |
457 // deleted, otherwise ownership of the value is passed back to the caller. | 458 // deleted, otherwise ownership of the value is passed back to the caller. |
458 // Returns an iterator pointing to the location of the element that | 459 // Returns an iterator pointing to the location of the element that |
459 // followed the erased element. | 460 // followed the erased element. |
460 iterator Erase(iterator iter, scoped_ptr<Value>* out_value); | 461 iterator Erase(iterator iter, std::unique_ptr<Value>* out_value); |
461 | 462 |
462 // Appends a Value to the end of the list. | 463 // Appends a Value to the end of the list. |
463 void Append(scoped_ptr<Value> in_value); | 464 void Append(std::unique_ptr<Value> in_value); |
464 // Deprecated version of the above. TODO(estade): remove. | 465 // Deprecated version of the above. TODO(estade): remove. |
465 void Append(Value* in_value); | 466 void Append(Value* in_value); |
466 | 467 |
467 // Convenience forms of Append. | 468 // Convenience forms of Append. |
468 void AppendBoolean(bool in_value); | 469 void AppendBoolean(bool in_value); |
469 void AppendInteger(int in_value); | 470 void AppendInteger(int in_value); |
470 void AppendDouble(double in_value); | 471 void AppendDouble(double in_value); |
471 void AppendString(const std::string& in_value); | 472 void AppendString(const std::string& in_value); |
472 void AppendString(const string16& in_value); | 473 void AppendString(const string16& in_value); |
473 void AppendStrings(const std::vector<std::string>& in_values); | 474 void AppendStrings(const std::vector<std::string>& in_values); |
(...skipping 23 matching lines...) Expand all Loading... |
497 const_iterator begin() const { return list_.begin(); } | 498 const_iterator begin() const { return list_.begin(); } |
498 const_iterator end() const { return list_.end(); } | 499 const_iterator end() const { return list_.end(); } |
499 | 500 |
500 // Overridden from Value: | 501 // Overridden from Value: |
501 bool GetAsList(ListValue** out_value) override; | 502 bool GetAsList(ListValue** out_value) override; |
502 bool GetAsList(const ListValue** out_value) const override; | 503 bool GetAsList(const ListValue** out_value) const override; |
503 ListValue* DeepCopy() const override; | 504 ListValue* DeepCopy() const override; |
504 bool Equals(const Value* other) const override; | 505 bool Equals(const Value* other) const override; |
505 | 506 |
506 // Preferred version of DeepCopy. TODO(estade): remove DeepCopy. | 507 // Preferred version of DeepCopy. TODO(estade): remove DeepCopy. |
507 scoped_ptr<ListValue> CreateDeepCopy() const; | 508 std::unique_ptr<ListValue> CreateDeepCopy() const; |
508 | 509 |
509 private: | 510 private: |
510 ValueVector list_; | 511 ValueVector list_; |
511 | 512 |
512 DISALLOW_COPY_AND_ASSIGN(ListValue); | 513 DISALLOW_COPY_AND_ASSIGN(ListValue); |
513 }; | 514 }; |
514 | 515 |
515 // This interface is implemented by classes that know how to serialize | 516 // This interface is implemented by classes that know how to serialize |
516 // Value objects. | 517 // Value objects. |
517 class BASE_EXPORT ValueSerializer { | 518 class BASE_EXPORT ValueSerializer { |
518 public: | 519 public: |
519 virtual ~ValueSerializer(); | 520 virtual ~ValueSerializer(); |
520 | 521 |
521 virtual bool Serialize(const Value& root) = 0; | 522 virtual bool Serialize(const Value& root) = 0; |
522 }; | 523 }; |
523 | 524 |
524 // This interface is implemented by classes that know how to deserialize Value | 525 // This interface is implemented by classes that know how to deserialize Value |
525 // objects. | 526 // objects. |
526 class BASE_EXPORT ValueDeserializer { | 527 class BASE_EXPORT ValueDeserializer { |
527 public: | 528 public: |
528 virtual ~ValueDeserializer(); | 529 virtual ~ValueDeserializer(); |
529 | 530 |
530 // This method deserializes the subclass-specific format into a Value object. | 531 // This method deserializes the subclass-specific format into a Value object. |
531 // If the return value is non-NULL, the caller takes ownership of returned | 532 // If the return value is non-NULL, the caller takes ownership of returned |
532 // Value. If the return value is NULL, and if error_code is non-NULL, | 533 // Value. If the return value is NULL, and if error_code is non-NULL, |
533 // error_code will be set with the underlying error. | 534 // error_code will be set with the underlying error. |
534 // If |error_message| is non-null, it will be filled in with a formatted | 535 // If |error_message| is non-null, it will be filled in with a formatted |
535 // error message including the location of the error if appropriate. | 536 // error message including the location of the error if appropriate. |
536 virtual scoped_ptr<Value> Deserialize(int* error_code, | 537 virtual std::unique_ptr<Value> Deserialize(int* error_code, |
537 std::string* error_str) = 0; | 538 std::string* error_str) = 0; |
538 }; | 539 }; |
539 | 540 |
540 // Stream operator so Values can be used in assertion statements. In order that | 541 // Stream operator so Values can be used in assertion statements. In order that |
541 // gtest uses this operator to print readable output on test failures, we must | 542 // gtest uses this operator to print readable output on test failures, we must |
542 // override each specific type. Otherwise, the default template implementation | 543 // override each specific type. Otherwise, the default template implementation |
543 // is preferred over an upcast. | 544 // is preferred over an upcast. |
544 BASE_EXPORT std::ostream& operator<<(std::ostream& out, const Value& value); | 545 BASE_EXPORT std::ostream& operator<<(std::ostream& out, const Value& value); |
545 | 546 |
546 BASE_EXPORT inline std::ostream& operator<<(std::ostream& out, | 547 BASE_EXPORT inline std::ostream& operator<<(std::ostream& out, |
547 const FundamentalValue& value) { | 548 const FundamentalValue& value) { |
(...skipping 11 matching lines...) Expand all Loading... |
559 } | 560 } |
560 | 561 |
561 BASE_EXPORT inline std::ostream& operator<<(std::ostream& out, | 562 BASE_EXPORT inline std::ostream& operator<<(std::ostream& out, |
562 const ListValue& value) { | 563 const ListValue& value) { |
563 return out << static_cast<const Value&>(value); | 564 return out << static_cast<const Value&>(value); |
564 } | 565 } |
565 | 566 |
566 } // namespace base | 567 } // namespace base |
567 | 568 |
568 #endif // BASE_VALUES_H_ | 569 #endif // BASE_VALUES_H_ |
OLD | NEW |