Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Side by Side Diff: base/values.cc

Issue 7661009: base: Add Is* functions to Value class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: tony review Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/values.h ('k') | base/values_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/values.h" 5 #include "base/values.h"
6 6
7 #include "base/float_util.h" 7 #include "base/float_util.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 // static 90 // static
91 StringValue* Value::CreateStringValue(const std::string& in_value) { 91 StringValue* Value::CreateStringValue(const std::string& in_value) {
92 return new StringValue(in_value); 92 return new StringValue(in_value);
93 } 93 }
94 94
95 // static 95 // static
96 StringValue* Value::CreateStringValue(const string16& in_value) { 96 StringValue* Value::CreateStringValue(const string16& in_value) {
97 return new StringValue(in_value); 97 return new StringValue(in_value);
98 } 98 }
99 99
100 bool Value::IsNull() const {
101 return type_ == TYPE_NULL;
102 }
103
104 bool Value::IsBoolean() const {
105 return type_ == TYPE_BOOLEAN;
106 }
107
108 bool Value::IsInteger() const {
109 return type_ == TYPE_INTEGER;
110 }
111
112 bool Value::IsDouble() const {
113 return type_ == TYPE_DOUBLE;
114 }
115
116 bool Value::IsString() const {
117 return type_ == TYPE_STRING;
118 }
119
120 bool Value::IsBinary() const {
121 return type_ == TYPE_BINARY;
122 }
123
124 bool Value::IsDictionary() const {
125 return type_ == TYPE_DICTIONARY;
126 }
127
128 bool Value::IsList() const {
129 return type_ == TYPE_LIST;
130 }
131
100 bool Value::GetAsBoolean(bool* out_value) const { 132 bool Value::GetAsBoolean(bool* out_value) const {
101 return false; 133 return false;
102 } 134 }
103 135
104 bool Value::GetAsInteger(int* out_value) const { 136 bool Value::GetAsInteger(int* out_value) const {
105 return false; 137 return false;
106 } 138 }
107 139
108 bool Value::GetAsDouble(double* out_value) const { 140 bool Value::GetAsDouble(double* out_value) const {
109 return false; 141 return false;
(...skipping 11 matching lines...) Expand all
121 return false; 153 return false;
122 } 154 }
123 155
124 bool Value::GetAsList(const ListValue** out_value) const { 156 bool Value::GetAsList(const ListValue** out_value) const {
125 return false; 157 return false;
126 } 158 }
127 159
128 Value* Value::DeepCopy() const { 160 Value* Value::DeepCopy() const {
129 // This method should only be getting called for null Values--all subclasses 161 // This method should only be getting called for null Values--all subclasses
130 // need to provide their own implementation;. 162 // need to provide their own implementation;.
131 DCHECK(IsType(TYPE_NULL)); 163 DCHECK(IsNull());
132 return CreateNullValue(); 164 return CreateNullValue();
133 } 165 }
134 166
135 bool Value::Equals(const Value* other) const { 167 bool Value::Equals(const Value* other) const {
136 // This method should only be getting called for null Values--all subclasses 168 // This method should only be getting called for null Values--all subclasses
137 // need to provide their own implementation;. 169 // need to provide their own implementation;.
138 DCHECK(IsType(TYPE_NULL)); 170 DCHECK(IsNull());
139 return other->IsType(TYPE_NULL); 171 return other->IsNull();
140 } 172 }
141 173
142 // static 174 // static
143 bool Value::Equals(const Value* a, const Value* b) { 175 bool Value::Equals(const Value* a, const Value* b) {
144 if ((a == NULL) && (b == NULL)) return true; 176 if ((a == NULL) && (b == NULL)) return true;
145 if ((a == NULL) ^ (b == NULL)) return false; 177 if ((a == NULL) ^ (b == NULL)) return false;
146 return a->Equals(b); 178 return a->Equals(b);
147 } 179 }
148 180
149 Value::Value(Type type) : type_(type) { 181 Value::Value(Type type) : type_(type) {
(...skipping 12 matching lines...) Expand all
162 FundamentalValue::FundamentalValue(double in_value) 194 FundamentalValue::FundamentalValue(double in_value)
163 : Value(TYPE_DOUBLE), double_value_(in_value) { 195 : Value(TYPE_DOUBLE), double_value_(in_value) {
164 // JSON doesn't support NaN or positive or negative infinity. 196 // JSON doesn't support NaN or positive or negative infinity.
165 DCHECK(IsFinite(in_value)); 197 DCHECK(IsFinite(in_value));
166 } 198 }
167 199
168 FundamentalValue::~FundamentalValue() { 200 FundamentalValue::~FundamentalValue() {
169 } 201 }
170 202
171 bool FundamentalValue::GetAsBoolean(bool* out_value) const { 203 bool FundamentalValue::GetAsBoolean(bool* out_value) const {
172 if (out_value && IsType(TYPE_BOOLEAN)) 204 if (out_value && IsBoolean())
173 *out_value = boolean_value_; 205 *out_value = boolean_value_;
174 return (IsType(TYPE_BOOLEAN)); 206 return (IsBoolean());
175 } 207 }
176 208
177 bool FundamentalValue::GetAsInteger(int* out_value) const { 209 bool FundamentalValue::GetAsInteger(int* out_value) const {
178 if (out_value && IsType(TYPE_INTEGER)) 210 if (out_value && IsInteger())
179 *out_value = integer_value_; 211 *out_value = integer_value_;
180 return (IsType(TYPE_INTEGER)); 212 return (IsInteger());
181 } 213 }
182 214
183 bool FundamentalValue::GetAsDouble(double* out_value) const { 215 bool FundamentalValue::GetAsDouble(double* out_value) const {
184 if (out_value && IsType(TYPE_DOUBLE)) 216 if (out_value && IsDouble())
185 *out_value = double_value_; 217 *out_value = double_value_;
186 else if (out_value && IsType(TYPE_INTEGER)) 218 else if (out_value && IsInteger())
187 *out_value = integer_value_; 219 *out_value = integer_value_;
188 return (IsType(TYPE_DOUBLE) || IsType(TYPE_INTEGER)); 220 return (IsDouble() || IsInteger());
189 } 221 }
190 222
191 FundamentalValue* FundamentalValue::DeepCopy() const { 223 FundamentalValue* FundamentalValue::DeepCopy() const {
192 switch (GetType()) { 224 switch (GetType()) {
193 case TYPE_BOOLEAN: 225 case TYPE_BOOLEAN:
194 return CreateBooleanValue(boolean_value_); 226 return CreateBooleanValue(boolean_value_);
195 227
196 case TYPE_INTEGER: 228 case TYPE_INTEGER:
197 return CreateIntegerValue(integer_value_); 229 return CreateIntegerValue(integer_value_);
198 230
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 } 507 }
476 508
477 out_value->assign(out); 509 out_value->assign(out);
478 return true; 510 return true;
479 } 511 }
480 512
481 bool DictionaryValue::GetBinary(const std::string& path, 513 bool DictionaryValue::GetBinary(const std::string& path,
482 BinaryValue** out_value) const { 514 BinaryValue** out_value) const {
483 Value* value; 515 Value* value;
484 bool result = Get(path, &value); 516 bool result = Get(path, &value);
485 if (!result || !value->IsType(TYPE_BINARY)) 517 if (!result || !value->IsBinary())
486 return false; 518 return false;
487 519
488 if (out_value) 520 if (out_value)
489 *out_value = static_cast<BinaryValue*>(value); 521 *out_value = static_cast<BinaryValue*>(value);
490 522
491 return true; 523 return true;
492 } 524 }
493 525
494 bool DictionaryValue::GetDictionary(const std::string& path, 526 bool DictionaryValue::GetDictionary(const std::string& path,
495 DictionaryValue** out_value) const { 527 DictionaryValue** out_value) const {
496 Value* value; 528 Value* value;
497 bool result = Get(path, &value); 529 bool result = Get(path, &value);
498 if (!result || !value->IsType(TYPE_DICTIONARY)) 530 if (!result || !value->IsDictionary())
499 return false; 531 return false;
500 532
501 if (out_value) 533 if (out_value)
502 *out_value = static_cast<DictionaryValue*>(value); 534 *out_value = static_cast<DictionaryValue*>(value);
503 535
504 return true; 536 return true;
505 } 537 }
506 538
507 bool DictionaryValue::GetList(const std::string& path, 539 bool DictionaryValue::GetList(const std::string& path,
508 ListValue** out_value) const { 540 ListValue** out_value) const {
509 Value* value; 541 Value* value;
510 bool result = Get(path, &value); 542 bool result = Get(path, &value);
511 if (!result || !value->IsType(TYPE_LIST)) 543 if (!result || !value->IsList())
512 return false; 544 return false;
513 545
514 if (out_value) 546 if (out_value)
515 *out_value = static_cast<ListValue*>(value); 547 *out_value = static_cast<ListValue*>(value);
516 548
517 return true; 549 return true;
518 } 550 }
519 551
520 bool DictionaryValue::GetWithoutPathExpansion(const std::string& key, 552 bool DictionaryValue::GetWithoutPathExpansion(const std::string& key,
521 Value** out_value) const { 553 Value** out_value) const {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 return false; 598 return false;
567 599
568 return value->GetAsString(out_value); 600 return value->GetAsString(out_value);
569 } 601 }
570 602
571 bool DictionaryValue::GetDictionaryWithoutPathExpansion( 603 bool DictionaryValue::GetDictionaryWithoutPathExpansion(
572 const std::string& key, 604 const std::string& key,
573 DictionaryValue** out_value) const { 605 DictionaryValue** out_value) const {
574 Value* value; 606 Value* value;
575 bool result = GetWithoutPathExpansion(key, &value); 607 bool result = GetWithoutPathExpansion(key, &value);
576 if (!result || !value->IsType(TYPE_DICTIONARY)) 608 if (!result || !value->IsDictionary())
577 return false; 609 return false;
578 610
579 if (out_value) 611 if (out_value)
580 *out_value = static_cast<DictionaryValue*>(value); 612 *out_value = static_cast<DictionaryValue*>(value);
581 613
582 return true; 614 return true;
583 } 615 }
584 616
585 bool DictionaryValue::GetListWithoutPathExpansion(const std::string& key, 617 bool DictionaryValue::GetListWithoutPathExpansion(const std::string& key,
586 ListValue** out_value) const { 618 ListValue** out_value) const {
587 Value* value; 619 Value* value;
588 bool result = GetWithoutPathExpansion(key, &value); 620 bool result = GetWithoutPathExpansion(key, &value);
589 if (!result || !value->IsType(TYPE_LIST)) 621 if (!result || !value->IsList())
590 return false; 622 return false;
591 623
592 if (out_value) 624 if (out_value)
593 *out_value = static_cast<ListValue*>(value); 625 *out_value = static_cast<ListValue*>(value);
594 626
595 return true; 627 return true;
596 } 628 }
597 629
598 bool DictionaryValue::Remove(const std::string& path, Value** out_value) { 630 bool DictionaryValue::Remove(const std::string& path, Value** out_value) {
599 DCHECK(IsStringUTF8(path)); 631 DCHECK(IsStringUTF8(path));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
631 Value* copy = CopyWithoutEmptyChildren(this); 663 Value* copy = CopyWithoutEmptyChildren(this);
632 return copy ? static_cast<DictionaryValue*>(copy) : new DictionaryValue; 664 return copy ? static_cast<DictionaryValue*>(copy) : new DictionaryValue;
633 } 665 }
634 666
635 void DictionaryValue::MergeDictionary(const DictionaryValue* dictionary) { 667 void DictionaryValue::MergeDictionary(const DictionaryValue* dictionary) {
636 for (DictionaryValue::key_iterator key(dictionary->begin_keys()); 668 for (DictionaryValue::key_iterator key(dictionary->begin_keys());
637 key != dictionary->end_keys(); ++key) { 669 key != dictionary->end_keys(); ++key) {
638 Value* merge_value; 670 Value* merge_value;
639 if (dictionary->GetWithoutPathExpansion(*key, &merge_value)) { 671 if (dictionary->GetWithoutPathExpansion(*key, &merge_value)) {
640 // Check whether we have to merge dictionaries. 672 // Check whether we have to merge dictionaries.
641 if (merge_value->IsType(Value::TYPE_DICTIONARY)) { 673 if (merge_value->IsDictionary()) {
642 DictionaryValue* sub_dict; 674 DictionaryValue* sub_dict;
643 if (GetDictionaryWithoutPathExpansion(*key, &sub_dict)) { 675 if (GetDictionaryWithoutPathExpansion(*key, &sub_dict)) {
644 sub_dict->MergeDictionary( 676 sub_dict->MergeDictionary(
645 static_cast<const DictionaryValue*>(merge_value)); 677 static_cast<const DictionaryValue*>(merge_value));
646 continue; 678 continue;
647 } 679 }
648 } 680 }
649 // All other cases: Make a copy and hook it up. 681 // All other cases: Make a copy and hook it up.
650 SetWithoutPathExpansion(*key, merge_value->DeepCopy()); 682 SetWithoutPathExpansion(*key, merge_value->DeepCopy());
651 } 683 }
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 Value* value; 800 Value* value;
769 if (!Get(index, &value)) 801 if (!Get(index, &value))
770 return false; 802 return false;
771 803
772 return value->GetAsString(out_value); 804 return value->GetAsString(out_value);
773 } 805 }
774 806
775 bool ListValue::GetBinary(size_t index, BinaryValue** out_value) const { 807 bool ListValue::GetBinary(size_t index, BinaryValue** out_value) const {
776 Value* value; 808 Value* value;
777 bool result = Get(index, &value); 809 bool result = Get(index, &value);
778 if (!result || !value->IsType(TYPE_BINARY)) 810 if (!result || !value->IsBinary())
779 return false; 811 return false;
780 812
781 if (out_value) 813 if (out_value)
782 *out_value = static_cast<BinaryValue*>(value); 814 *out_value = static_cast<BinaryValue*>(value);
783 815
784 return true; 816 return true;
785 } 817 }
786 818
787 bool ListValue::GetDictionary(size_t index, DictionaryValue** out_value) const { 819 bool ListValue::GetDictionary(size_t index, DictionaryValue** out_value) const {
788 Value* value; 820 Value* value;
789 bool result = Get(index, &value); 821 bool result = Get(index, &value);
790 if (!result || !value->IsType(TYPE_DICTIONARY)) 822 if (!result || !value->IsDictionary())
791 return false; 823 return false;
792 824
793 if (out_value) 825 if (out_value)
794 *out_value = static_cast<DictionaryValue*>(value); 826 *out_value = static_cast<DictionaryValue*>(value);
795 827
796 return true; 828 return true;
797 } 829 }
798 830
799 bool ListValue::GetList(size_t index, ListValue** out_value) const { 831 bool ListValue::GetList(size_t index, ListValue** out_value) const {
800 Value* value; 832 Value* value;
801 bool result = Get(index, &value); 833 bool result = Get(index, &value);
802 if (!result || !value->IsType(TYPE_LIST)) 834 if (!result || !value->IsList())
803 return false; 835 return false;
804 836
805 if (out_value) 837 if (out_value)
806 *out_value = static_cast<ListValue*>(value); 838 *out_value = static_cast<ListValue*>(value);
807 839
808 return true; 840 return true;
809 } 841 }
810 842
811 bool ListValue::Remove(size_t index, Value** out_value) { 843 bool ListValue::Remove(size_t index, Value** out_value) {
812 if (index >= list_.size()) 844 if (index >= list_.size())
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
899 if (lhs_it != end() || rhs_it != other_list->end()) 931 if (lhs_it != end() || rhs_it != other_list->end())
900 return false; 932 return false;
901 933
902 return true; 934 return true;
903 } 935 }
904 936
905 ValueSerializer::~ValueSerializer() { 937 ValueSerializer::~ValueSerializer() {
906 } 938 }
907 939
908 } // namespace base 940 } // namespace base
OLDNEW
« no previous file with comments | « base/values.h ('k') | base/values_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698