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. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
43 using StringValue = Value; | 43 using StringValue = Value; |
44 using BinaryValue = Value; | 44 using BinaryValue = Value; |
45 | 45 |
46 // The Value class is the base class for Values. A Value can be instantiated | 46 // The Value class is the base class for Values. A Value can be instantiated |
47 // via the Create*Value() factory methods, or by directly creating instances of | 47 // via the Create*Value() factory methods, or by directly creating instances of |
48 // the subclasses. | 48 // the subclasses. |
49 // | 49 // |
50 // See the file-level comment above for more information. | 50 // See the file-level comment above for more information. |
51 class BASE_EXPORT Value { | 51 class BASE_EXPORT Value { |
52 public: | 52 public: |
53 using DictStorage = std::map<std::string, std::unique_ptr<Value>>; | |
brettw
2017/02/11 00:24:04
As I commented in the private thread, does the siz
jdoerrie
2017/02/14 17:06:56
Done. Wrapping the map in a unique_ptr results in
| |
54 using ListStorage = std::vector<std::unique_ptr<Value>>; | |
55 | |
53 enum class Type { | 56 enum class Type { |
54 NONE = 0, | 57 NONE = 0, |
55 BOOLEAN, | 58 BOOLEAN, |
56 INTEGER, | 59 INTEGER, |
57 DOUBLE, | 60 DOUBLE, |
58 STRING, | 61 STRING, |
59 BINARY, | 62 BINARY, |
60 DICTIONARY, | 63 DICTIONARY, |
61 LIST | 64 LIST |
62 // Note: Do not add more types. See the file-level comment above for why. | 65 // Note: Do not add more types. See the file-level comment above for why. |
(...skipping 29 matching lines...) Expand all Loading... | |
92 explicit Value(const char16* in_string); | 95 explicit Value(const char16* in_string); |
93 explicit Value(const string16& in_string); | 96 explicit Value(const string16& in_string); |
94 explicit Value(StringPiece in_string); | 97 explicit Value(StringPiece in_string); |
95 | 98 |
96 explicit Value(const std::vector<char>& in_blob); | 99 explicit Value(const std::vector<char>& in_blob); |
97 explicit Value(std::vector<char>&& in_blob); | 100 explicit Value(std::vector<char>&& in_blob); |
98 | 101 |
99 Value& operator=(const Value& that); | 102 Value& operator=(const Value& that); |
100 Value& operator=(Value&& that); | 103 Value& operator=(Value&& that); |
101 | 104 |
102 virtual ~Value(); | 105 ~Value(); |
103 | 106 |
104 // Returns the name for a given |type|. | 107 // Returns the name for a given |type|. |
105 static const char* GetTypeName(Type type); | 108 static const char* GetTypeName(Type type); |
106 | 109 |
107 // Returns the type of the value stored by the current Value object. | 110 // Returns the type of the value stored by the current Value object. |
108 // Each type will be implemented by only one subclass of Value, so it's | 111 // Each type will be implemented by only one subclass of Value, so it's |
109 // safe to use the Type to determine whether you can cast from | 112 // safe to use the Type to determine whether you can cast from |
110 // Value* to (Implementing Class)*. Also, a Value object never changes | 113 // Value* to (Implementing Class)*. Also, a Value object never changes |
111 // its type after construction. | 114 // its type after construction. |
112 Type GetType() const { return type_; } // DEPRECATED, use type(). | 115 Type GetType() const { return type_; } // DEPRECATED, use type(). |
(...skipping 16 matching lines...) Expand all Loading... | |
129 const std::string& GetString() const; | 132 const std::string& GetString() const; |
130 const std::vector<char>& GetBlob() const; | 133 const std::vector<char>& GetBlob() const; |
131 | 134 |
132 size_t GetSize() const; // DEPRECATED, use GetBlob().size() instead. | 135 size_t GetSize() const; // DEPRECATED, use GetBlob().size() instead. |
133 const char* GetBuffer() const; // DEPRECATED, use GetBlob().data() instead. | 136 const char* GetBuffer() const; // DEPRECATED, use GetBlob().data() instead. |
134 | 137 |
135 // These methods allow the convenient retrieval of the contents of the Value. | 138 // These methods allow the convenient retrieval of the contents of the Value. |
136 // If the current object can be converted into the given type, the value is | 139 // If the current object can be converted into the given type, the value is |
137 // returned through the |out_value| parameter and true is returned; | 140 // returned through the |out_value| parameter and true is returned; |
138 // otherwise, false is returned and |out_value| is unchanged. | 141 // otherwise, false is returned and |out_value| is unchanged. |
139 virtual bool GetAsBoolean(bool* out_value) const; | 142 bool GetAsBoolean(bool* out_value) const; |
140 virtual bool GetAsInteger(int* out_value) const; | 143 bool GetAsInteger(int* out_value) const; |
141 virtual bool GetAsDouble(double* out_value) const; | 144 bool GetAsDouble(double* out_value) const; |
142 virtual bool GetAsString(std::string* out_value) const; | 145 bool GetAsString(std::string* out_value) const; |
143 virtual bool GetAsString(string16* out_value) const; | 146 bool GetAsString(string16* out_value) const; |
144 virtual bool GetAsString(const StringValue** out_value) const; | 147 bool GetAsString(const StringValue** out_value) const; |
145 virtual bool GetAsString(StringPiece* out_value) const; | 148 bool GetAsString(StringPiece* out_value) const; |
146 virtual bool GetAsBinary(const BinaryValue** out_value) const; | 149 bool GetAsBinary(const BinaryValue** out_value) const; |
147 // ListValue::From is the equivalent for std::unique_ptr conversions. | 150 // ListValue::From is the equivalent for std::unique_ptr conversions. |
148 virtual bool GetAsList(ListValue** out_value); | 151 bool GetAsList(ListValue** out_value); |
149 virtual bool GetAsList(const ListValue** out_value) const; | 152 bool GetAsList(const ListValue** out_value) const; |
150 // DictionaryValue::From is the equivalent for std::unique_ptr conversions. | 153 // DictionaryValue::From is the equivalent for std::unique_ptr conversions. |
151 virtual bool GetAsDictionary(DictionaryValue** out_value); | 154 bool GetAsDictionary(DictionaryValue** out_value); |
152 virtual bool GetAsDictionary(const DictionaryValue** out_value) const; | 155 bool GetAsDictionary(const DictionaryValue** out_value) const; |
153 // Note: Do not add more types. See the file-level comment above for why. | 156 // Note: Do not add more types. See the file-level comment above for why. |
154 | 157 |
155 // This creates a deep copy of the entire Value tree, and returns a pointer | 158 // This creates a deep copy of the entire Value tree, and returns a pointer |
156 // to the copy. The caller gets ownership of the copy, of course. | 159 // to the copy. The caller gets ownership of the copy, of course. |
157 // Subclasses return their own type directly in their overrides; | 160 // Subclasses return their own type directly in their overrides; |
158 // this works because C++ supports covariant return types. | 161 // this works because C++ supports covariant return types. |
159 virtual Value* DeepCopy() const; | 162 Value* DeepCopy() const; |
160 // Preferred version of DeepCopy. TODO(estade): remove the above. | 163 // Preferred version of DeepCopy. TODO(estade): remove the above. |
161 std::unique_ptr<Value> CreateDeepCopy() const; | 164 std::unique_ptr<Value> CreateDeepCopy() const; |
162 | 165 |
163 // Compares if two Value objects have equal contents. | 166 // Compares if two Value objects have equal contents. |
164 virtual bool Equals(const Value* other) const; | 167 bool Equals(const Value* other) const; |
165 | 168 |
166 // Compares if two Value objects have equal contents. Can handle NULLs. | 169 // Compares if two Value objects have equal contents. Can handle NULLs. |
167 // NULLs are considered equal but different from Value::CreateNullValue(). | 170 // NULLs are considered equal but different from Value::CreateNullValue(). |
168 static bool Equals(const Value* a, const Value* b); | 171 static bool Equals(const Value* a, const Value* b); |
169 | 172 |
170 private: | 173 protected: |
171 void InternalCopyFundamentalValue(const Value& that); | 174 // TODO(crbug.com/646113): Make these private once DictionaryValue and |
172 void InternalCopyConstructFrom(const Value& that); | 175 // ListValue are properly inlined. |
173 void InternalMoveConstructFrom(Value&& that); | |
174 void InternalCopyAssignFrom(const Value& that); | |
175 void InternalMoveAssignFrom(Value&& that); | |
176 void InternalCleanup(); | |
177 | |
178 Type type_; | 176 Type type_; |
179 | 177 |
180 union { | 178 union { |
181 bool bool_value_; | 179 bool bool_value_; |
182 int int_value_; | 180 int int_value_; |
183 double double_value_; | 181 double double_value_; |
184 ManualConstructor<std::string> string_value_; | 182 ManualConstructor<std::string> string_value_; |
185 ManualConstructor<std::vector<char>> binary_value_; | 183 ManualConstructor<std::vector<char>> binary_value_; |
184 ManualConstructor<DictStorage> dictionary_; | |
185 ManualConstructor<ListStorage> list_; | |
186 }; | 186 }; |
187 | |
188 private: | |
189 void InternalCopyFundamentalValue(const Value& that); | |
190 void InternalCopyConstructFrom(const Value& that); | |
191 void InternalMoveConstructFrom(Value&& that); | |
192 void InternalCopyAssignFrom(const Value& that); | |
193 void InternalMoveAssignFrom(Value&& that); | |
194 void InternalCleanup(); | |
187 }; | 195 }; |
188 | 196 |
189 // DictionaryValue provides a key-value dictionary with (optional) "path" | 197 // DictionaryValue provides a key-value dictionary with (optional) "path" |
190 // parsing for recursive access; see the comment at the top of the file. Keys | 198 // parsing for recursive access; see the comment at the top of the file. Keys |
191 // are |std::string|s and should be UTF-8 encoded. | 199 // are |std::string|s and should be UTF-8 encoded. |
192 class BASE_EXPORT DictionaryValue : public Value { | 200 class BASE_EXPORT DictionaryValue : public Value { |
193 public: | 201 public: |
194 using Storage = std::map<std::string, std::unique_ptr<Value>>; | |
195 // Returns |value| if it is a dictionary, nullptr otherwise. | 202 // Returns |value| if it is a dictionary, nullptr otherwise. |
196 static std::unique_ptr<DictionaryValue> From(std::unique_ptr<Value> value); | 203 static std::unique_ptr<DictionaryValue> From(std::unique_ptr<Value> value); |
197 | 204 |
198 DictionaryValue(); | 205 DictionaryValue(); |
199 ~DictionaryValue() override; | 206 ~DictionaryValue(); |
200 | |
201 // Overridden from Value: | |
202 bool GetAsDictionary(DictionaryValue** out_value) override; | |
203 bool GetAsDictionary(const DictionaryValue** out_value) const override; | |
204 | 207 |
205 // Returns true if the current dictionary has a value for the given key. | 208 // Returns true if the current dictionary has a value for the given key. |
206 bool HasKey(StringPiece key) const; | 209 bool HasKey(StringPiece key) const; |
207 | 210 |
208 // Returns the number of Values in this dictionary. | 211 // Returns the number of Values in this dictionary. |
209 size_t size() const { return dictionary_.size(); } | 212 size_t size() const { return dictionary_->size(); } |
210 | 213 |
211 // Returns whether the dictionary is empty. | 214 // Returns whether the dictionary is empty. |
212 bool empty() const { return dictionary_.empty(); } | 215 bool empty() const { return dictionary_->empty(); } |
213 | 216 |
214 // Clears any current contents of this dictionary. | 217 // Clears any current contents of this dictionary. |
215 void Clear(); | 218 void Clear(); |
216 | 219 |
217 // Sets the Value associated with the given path starting from this object. | 220 // Sets the Value associated with the given path starting from this object. |
218 // A path has the form "<key>" or "<key>.<key>.[...]", where "." indexes | 221 // A path has the form "<key>" or "<key>.<key>.[...]", where "." indexes |
219 // into the next DictionaryValue down. Obviously, "." can't be used | 222 // into the next DictionaryValue down. Obviously, "." can't be used |
220 // within a key, but there are no other restrictions on keys. | 223 // within a key, but there are no other restrictions on keys. |
221 // If the key at any step of the way doesn't exist, or exists but isn't | 224 // If the key at any step of the way doesn't exist, or exists but isn't |
222 // a DictionaryValue, a new DictionaryValue will be created and attached | 225 // a DictionaryValue, a new DictionaryValue will be created and attached |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
302 // Removes the Value with the specified path from this dictionary (or one | 305 // Removes the Value with the specified path from this dictionary (or one |
303 // of its child dictionaries, if the path is more than just a local key). | 306 // of its child dictionaries, if the path is more than just a local key). |
304 // If |out_value| is non-NULL, the removed Value will be passed out via | 307 // If |out_value| is non-NULL, the removed Value will be passed out via |
305 // |out_value|. If |out_value| is NULL, the removed value will be deleted. | 308 // |out_value|. If |out_value| is NULL, the removed value will be deleted. |
306 // This method returns true if |path| is a valid path; otherwise it will | 309 // This method returns true if |path| is a valid path; otherwise it will |
307 // return false and the DictionaryValue object will be unchanged. | 310 // return false and the DictionaryValue object will be unchanged. |
308 bool Remove(StringPiece path, std::unique_ptr<Value>* out_value); | 311 bool Remove(StringPiece path, std::unique_ptr<Value>* out_value); |
309 | 312 |
310 // Like Remove(), but without special treatment of '.'. This allows e.g. URLs | 313 // Like Remove(), but without special treatment of '.'. This allows e.g. URLs |
311 // to be used as paths. | 314 // to be used as paths. |
312 virtual bool RemoveWithoutPathExpansion(StringPiece key, | 315 bool RemoveWithoutPathExpansion(StringPiece key, |
313 std::unique_ptr<Value>* out_value); | 316 std::unique_ptr<Value>* out_value); |
314 | 317 |
315 // Removes a path, clearing out all dictionaries on |path| that remain empty | 318 // Removes a path, clearing out all dictionaries on |path| that remain empty |
316 // after removing the value at |path|. | 319 // after removing the value at |path|. |
317 bool RemovePath(StringPiece path, std::unique_ptr<Value>* out_value); | 320 bool RemovePath(StringPiece path, std::unique_ptr<Value>* out_value); |
318 | 321 |
319 // Makes a copy of |this| but doesn't include empty dictionaries and lists in | 322 // Makes a copy of |this| but doesn't include empty dictionaries and lists in |
320 // the copy. This never returns NULL, even if |this| itself is empty. | 323 // the copy. This never returns NULL, even if |this| itself is empty. |
321 std::unique_ptr<DictionaryValue> DeepCopyWithoutEmptyChildren() const; | 324 std::unique_ptr<DictionaryValue> DeepCopyWithoutEmptyChildren() const; |
322 | 325 |
323 // Merge |dictionary| into this dictionary. This is done recursively, i.e. any | 326 // Merge |dictionary| into this dictionary. This is done recursively, i.e. any |
324 // sub-dictionaries will be merged as well. In case of key collisions, the | 327 // sub-dictionaries will be merged as well. In case of key collisions, the |
325 // passed in dictionary takes precedence and data already present will be | 328 // passed in dictionary takes precedence and data already present will be |
326 // replaced. Values within |dictionary| are deep-copied, so |dictionary| may | 329 // replaced. Values within |dictionary| are deep-copied, so |dictionary| may |
327 // be freed any time after this call. | 330 // be freed any time after this call. |
328 void MergeDictionary(const DictionaryValue* dictionary); | 331 void MergeDictionary(const DictionaryValue* dictionary); |
329 | 332 |
330 // Swaps contents with the |other| dictionary. | 333 // Swaps contents with the |other| dictionary. |
331 virtual void Swap(DictionaryValue* other); | 334 void Swap(DictionaryValue* other); |
332 | 335 |
333 // This class provides an iterator over both keys and values in the | 336 // This class provides an iterator over both keys and values in the |
334 // dictionary. It can't be used to modify the dictionary. | 337 // dictionary. It can't be used to modify the dictionary. |
335 class BASE_EXPORT Iterator { | 338 class BASE_EXPORT Iterator { |
336 public: | 339 public: |
337 explicit Iterator(const DictionaryValue& target); | 340 explicit Iterator(const DictionaryValue& target); |
338 Iterator(const Iterator& other); | 341 Iterator(const Iterator& other); |
339 ~Iterator(); | 342 ~Iterator(); |
340 | 343 |
341 bool IsAtEnd() const { return it_ == target_.dictionary_.end(); } | 344 bool IsAtEnd() const { return it_ == target_.dictionary_->end(); } |
342 void Advance() { ++it_; } | 345 void Advance() { ++it_; } |
343 | 346 |
344 const std::string& key() const { return it_->first; } | 347 const std::string& key() const { return it_->first; } |
345 const Value& value() const { return *it_->second; } | 348 const Value& value() const { return *it_->second; } |
346 | 349 |
347 private: | 350 private: |
348 const DictionaryValue& target_; | 351 const DictionaryValue& target_; |
349 Storage::const_iterator it_; | 352 DictStorage::const_iterator it_; |
350 }; | 353 }; |
351 | 354 |
352 // Overridden from Value: | 355 DictionaryValue* DeepCopy() const; |
353 DictionaryValue* DeepCopy() const override; | |
354 // Preferred version of DeepCopy. TODO(estade): remove the above. | 356 // Preferred version of DeepCopy. TODO(estade): remove the above. |
355 std::unique_ptr<DictionaryValue> CreateDeepCopy() const; | 357 std::unique_ptr<DictionaryValue> CreateDeepCopy() const; |
356 bool Equals(const Value* other) const override; | |
357 | |
358 private: | |
359 Storage dictionary_; | |
360 | |
361 DISALLOW_COPY_AND_ASSIGN(DictionaryValue); | |
jdoerrie
2017/02/10 18:45:44
Given that it is currently impossible to copy cons
| |
362 }; | 358 }; |
363 | 359 |
364 // This type of Value represents a list of other Value values. | 360 // This type of Value represents a list of other Value values. |
365 class BASE_EXPORT ListValue : public Value { | 361 class BASE_EXPORT ListValue : public Value { |
366 public: | 362 public: |
367 using Storage = std::vector<std::unique_ptr<Value>>; | 363 using const_iterator = ListStorage::const_iterator; |
368 using const_iterator = Storage::const_iterator; | 364 using iterator = ListStorage::iterator; |
369 using iterator = Storage::iterator; | |
370 | 365 |
371 // Returns |value| if it is a list, nullptr otherwise. | 366 // Returns |value| if it is a list, nullptr otherwise. |
372 static std::unique_ptr<ListValue> From(std::unique_ptr<Value> value); | 367 static std::unique_ptr<ListValue> From(std::unique_ptr<Value> value); |
373 | 368 |
374 ListValue(); | 369 ListValue(); |
375 ~ListValue() override; | 370 ~ListValue(); |
376 | 371 |
377 // Clears the contents of this ListValue | 372 // Clears the contents of this ListValue |
378 void Clear(); | 373 void Clear(); |
379 | 374 |
380 // Returns the number of Values in this list. | 375 // Returns the number of Values in this list. |
381 size_t GetSize() const { return list_.size(); } | 376 size_t GetSize() const { return list_->size(); } |
382 | 377 |
383 // Returns whether the list is empty. | 378 // Returns whether the list is empty. |
384 bool empty() const { return list_.empty(); } | 379 bool empty() const { return list_->empty(); } |
385 | 380 |
386 // Sets the list item at the given index to be the Value specified by | 381 // Sets the list item at the given index to be the Value specified by |
387 // the value given. If the index beyond the current end of the list, null | 382 // the value given. If the index beyond the current end of the list, null |
388 // Values will be used to pad out the list. | 383 // Values will be used to pad out the list. |
389 // Returns true if successful, or false if the index was negative or | 384 // Returns true if successful, or false if the index was negative or |
390 // the value is a null pointer. | 385 // the value is a null pointer. |
391 bool Set(size_t index, Value* in_value); | 386 bool Set(size_t index, Value* in_value); |
392 // Preferred version of the above. TODO(estade): remove the above. | 387 // Preferred version of the above. TODO(estade): remove the above. |
393 bool Set(size_t index, std::unique_ptr<Value> in_value); | 388 bool Set(size_t index, std::unique_ptr<Value> in_value); |
394 | 389 |
(...skipping 20 matching lines...) Expand all Loading... | |
415 bool GetDictionary(size_t index, const DictionaryValue** out_value) const; | 410 bool GetDictionary(size_t index, const DictionaryValue** out_value) const; |
416 bool GetDictionary(size_t index, DictionaryValue** out_value); | 411 bool GetDictionary(size_t index, DictionaryValue** out_value); |
417 bool GetList(size_t index, const ListValue** out_value) const; | 412 bool GetList(size_t index, const ListValue** out_value) const; |
418 bool GetList(size_t index, ListValue** out_value); | 413 bool GetList(size_t index, ListValue** out_value); |
419 | 414 |
420 // Removes the Value with the specified index from this list. | 415 // Removes the Value with the specified index from this list. |
421 // If |out_value| is non-NULL, the removed Value AND ITS OWNERSHIP will be | 416 // If |out_value| is non-NULL, the removed Value AND ITS OWNERSHIP will be |
422 // passed out via |out_value|. If |out_value| is NULL, the removed value will | 417 // passed out via |out_value|. If |out_value| is NULL, the removed value will |
423 // be deleted. This method returns true if |index| is valid; otherwise | 418 // be deleted. This method returns true if |index| is valid; otherwise |
424 // it will return false and the ListValue object will be unchanged. | 419 // it will return false and the ListValue object will be unchanged. |
425 virtual bool Remove(size_t index, std::unique_ptr<Value>* out_value); | 420 bool Remove(size_t index, std::unique_ptr<Value>* out_value); |
426 | 421 |
427 // Removes the first instance of |value| found in the list, if any, and | 422 // Removes the first instance of |value| found in the list, if any, and |
428 // deletes it. |index| is the location where |value| was found. Returns false | 423 // deletes it. |index| is the location where |value| was found. Returns false |
429 // if not found. | 424 // if not found. |
430 bool Remove(const Value& value, size_t* index); | 425 bool Remove(const Value& value, size_t* index); |
431 | 426 |
432 // Removes the element at |iter|. If |out_value| is NULL, the value will be | 427 // Removes the element at |iter|. If |out_value| is NULL, the value will be |
433 // deleted, otherwise ownership of the value is passed back to the caller. | 428 // deleted, otherwise ownership of the value is passed back to the caller. |
434 // Returns an iterator pointing to the location of the element that | 429 // Returns an iterator pointing to the location of the element that |
435 // followed the erased element. | 430 // followed the erased element. |
(...skipping 22 matching lines...) Expand all Loading... | |
458 // Insert a Value at index. | 453 // Insert a Value at index. |
459 // Returns true if successful, or false if the index was out of range. | 454 // Returns true if successful, or false if the index was out of range. |
460 bool Insert(size_t index, std::unique_ptr<Value> in_value); | 455 bool Insert(size_t index, std::unique_ptr<Value> in_value); |
461 | 456 |
462 // Searches for the first instance of |value| in the list using the Equals | 457 // Searches for the first instance of |value| in the list using the Equals |
463 // method of the Value type. | 458 // method of the Value type. |
464 // Returns a const_iterator to the found item or to end() if none exists. | 459 // Returns a const_iterator to the found item or to end() if none exists. |
465 const_iterator Find(const Value& value) const; | 460 const_iterator Find(const Value& value) const; |
466 | 461 |
467 // Swaps contents with the |other| list. | 462 // Swaps contents with the |other| list. |
468 virtual void Swap(ListValue* other); | 463 void Swap(ListValue* other); |
469 | 464 |
470 // Iteration. | 465 // Iteration. |
471 iterator begin() { return list_.begin(); } | 466 iterator begin() { return list_->begin(); } |
472 iterator end() { return list_.end(); } | 467 iterator end() { return list_->end(); } |
473 | 468 |
474 const_iterator begin() const { return list_.begin(); } | 469 const_iterator begin() const { return list_->begin(); } |
475 const_iterator end() const { return list_.end(); } | 470 const_iterator end() const { return list_->end(); } |
476 | 471 |
477 // Overridden from Value: | 472 ListValue* DeepCopy() const; |
478 bool GetAsList(ListValue** out_value) override; | |
479 bool GetAsList(const ListValue** out_value) const override; | |
480 ListValue* DeepCopy() const override; | |
481 bool Equals(const Value* other) const override; | |
482 | |
483 // Preferred version of DeepCopy. TODO(estade): remove DeepCopy. | 473 // Preferred version of DeepCopy. TODO(estade): remove DeepCopy. |
484 std::unique_ptr<ListValue> CreateDeepCopy() const; | 474 std::unique_ptr<ListValue> CreateDeepCopy() const; |
485 | |
486 private: | |
487 Storage list_; | |
488 | |
489 DISALLOW_COPY_AND_ASSIGN(ListValue); | |
jdoerrie
2017/02/10 18:45:44
Same as above.
| |
490 }; | 475 }; |
491 | 476 |
492 // This interface is implemented by classes that know how to serialize | 477 // This interface is implemented by classes that know how to serialize |
493 // Value objects. | 478 // Value objects. |
494 class BASE_EXPORT ValueSerializer { | 479 class BASE_EXPORT ValueSerializer { |
495 public: | 480 public: |
496 virtual ~ValueSerializer(); | 481 virtual ~ValueSerializer(); |
497 | 482 |
498 virtual bool Serialize(const Value& root) = 0; | 483 virtual bool Serialize(const Value& root) = 0; |
499 }; | 484 }; |
(...skipping 30 matching lines...) Expand all Loading... | |
530 return out << static_cast<const Value&>(value); | 515 return out << static_cast<const Value&>(value); |
531 } | 516 } |
532 | 517 |
533 // Stream operator so that enum class Types can be used in log statements. | 518 // Stream operator so that enum class Types can be used in log statements. |
534 BASE_EXPORT std::ostream& operator<<(std::ostream& out, | 519 BASE_EXPORT std::ostream& operator<<(std::ostream& out, |
535 const Value::Type& type); | 520 const Value::Type& type); |
536 | 521 |
537 } // namespace base | 522 } // namespace base |
538 | 523 |
539 #endif // BASE_VALUES_H_ | 524 #endif // BASE_VALUES_H_ |
OLD | NEW |