1 // Copyright (c) 2013 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 #include "tools/gn/value.h"
6
7 #include "base/strings/string_number_conversions.h"
8
Value()9 Value::Value()
10 : type_(NONE),
11 int_value_(0),
12 origin_(NULL) {
13 }
14
Value(const ParseNode * origin,Type t)15 Value::Value(const ParseNode* origin, Type t)
16 : type_(t),
17 int_value_(0),
18 origin_(origin) {
19 }
20
Value(const ParseNode * origin,bool bool_val)21 Value::Value(const ParseNode* origin, bool bool_val)
22 : type_(BOOLEAN),
23 boolean_value_(bool_val),
24 int_value_(0),
25 origin_(origin) {
26 }
27
Value(const ParseNode * origin,int64 int_val)28 Value::Value(const ParseNode* origin, int64 int_val)
29 : type_(INTEGER),
30 boolean_value_(false),
31 int_value_(int_val),
32 origin_(origin) {
33 }
34
Value(const ParseNode * origin,std::string str_val)35 Value::Value(const ParseNode* origin, std::string str_val)
36 : type_(STRING),
37 string_value_(),
38 int_value_(0),
39 origin_(origin) {
40 string_value_.swap(str_val);
41 }
42
Value(const ParseNode * origin,const char * str_val)43 Value::Value(const ParseNode* origin, const char* str_val)
44 : type_(STRING),
45 string_value_(str_val),
46 int_value_(0),
47 origin_(origin) {
48 }
49
~Value()50 Value::~Value() {
51 }
52
RecursivelySetOrigin(const ParseNode * origin)53 void Value::RecursivelySetOrigin(const ParseNode* origin) {
54 set_origin(origin);
55 if (type_ == Value::LIST) {
56 for (size_t i = 0; i < list_value_.size(); i++)
57 list_value_[i].RecursivelySetOrigin(origin);
58 }
59 }
60
61 // static
DescribeType(Type t)62 const char* Value::DescribeType(Type t) {
63 switch (t) {
64 case NONE:
65 return "none";
66 case BOOLEAN:
67 return "boolean";
68 case INTEGER:
69 return "integer";
70 case STRING:
71 return "string";
72 case LIST:
73 return "list";
74 default:
75 NOTREACHED();
76 return "UNKNOWN";
77 }
78 }
79
ToString(bool quote_string) const80 std::string Value::ToString(bool quote_string) const {
81 switch (type_) {
82 case NONE:
83 return "<void>";
84 case BOOLEAN:
85 return boolean_value_ ? "true" : "false";
86 case INTEGER:
87 return base::Int64ToString(int_value_);
88 case STRING:
89 if (quote_string)
90 return "\"" + string_value_ + "\"";
91 return string_value_;
92 case LIST: {
93 std::string result = "[";
94 for (size_t i = 0; i < list_value_.size(); i++) {
95 if (i > 0)
96 result += ", ";
97 result += list_value_[i].ToString(true);
98 }
99 result.push_back(']');
100 return result;
101 }
102 }
103 return std::string();
104 }
105
VerifyTypeIs(Type t,Err * err) const106 bool Value::VerifyTypeIs(Type t, Err* err) const {
107 if (type_ == t)
108 return true;
109
110 *err = Err(origin(), std::string("This is not a ") + DescribeType(t) + ".");
111 return false;
112 }
113
operator ==(const Value & other) const114 bool Value::operator==(const Value& other) const {
115 if (type_ != other.type_)
116 return false;
117
118 switch (type_) {
119 case Value::BOOLEAN:
120 return boolean_value() == other.boolean_value();
121 case Value::INTEGER:
122 return int_value() == other.int_value();
123 case Value::STRING:
124 return string_value() == other.string_value();
125 case Value::LIST:
126 if (list_value().size() != other.list_value().size())
127 return false;
128 for (size_t i = 0; i < list_value().size(); i++) {
129 if (list_value()[i] != other.list_value()[i])
130 return false;
131 }
132 return true;
133 default:
134 return false;
135 }
136 }
137
operator !=(const Value & other) const138 bool Value::operator!=(const Value& other) const {
139 return !operator==(other);
140 }
141