Index: tools/gn/value.cc |
diff --git a/tools/gn/value.cc b/tools/gn/value.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cb78faadcfda8bea054f7497d877bdfbf4451b1d |
--- /dev/null |
+++ b/tools/gn/value.cc |
@@ -0,0 +1,126 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "tools/gn/value.h" |
+ |
+#include "base/strings/string_number_conversions.h" |
+ |
+Value::Value() |
+ : type_(NONE), |
+ int_value_(0), |
+ origin_(NULL) { |
+} |
+ |
+Value::Value(const ParseNode* origin, Type t) |
+ : type_(t), |
+ int_value_(0), |
+ origin_(origin) { |
+} |
+ |
+Value::Value(const ParseNode* origin, int64 int_val) |
+ : type_(INTEGER), |
+ int_value_(int_val), |
+ origin_(origin) { |
+} |
+ |
+Value::Value(const ParseNode* origin, const base::StringPiece& str_val) |
+ : type_(STRING), |
+ string_value_(str_val.as_string()), |
+ int_value_(0), |
+ origin_(origin) { |
+} |
+ |
+Value::~Value() { |
+} |
+ |
+// static |
+const char* Value::DescribeType(Type t) { |
+ switch (t) { |
+ case NONE: |
+ return "none"; |
+ case INTEGER: |
+ return "integer"; |
+ case STRING: |
+ return "string"; |
+ case LIST: |
+ return "list"; |
+ default: |
+ NOTREACHED(); |
+ return "UNKNOWN"; |
+ } |
+} |
+ |
+int64 Value::InterpretAsInt() const { |
+ switch (type_) { |
+ case NONE: |
+ return 0; |
+ case INTEGER: |
+ return int_value_; |
+ case STRING: |
+ return string_value_.empty() ? 0 : 1; |
+ case LIST: |
+ return list_value_.empty() ? 0 : 1; |
+ } |
+ return 0; |
+} |
+ |
+std::string Value::ToString() const { |
+ switch (type_) { |
+ case NONE: |
+ return "<void>"; |
+ case INTEGER: |
+ return base::Int64ToString(int_value_); |
+ case STRING: |
+ return string_value_; |
+ case LIST: { |
+ std::string result = "["; |
+ for (size_t i = 0; i < list_value_.size(); i++) { |
+ if (i > 0) |
+ result += ", "; |
+ // TODO(brettw) maybe also want to escape quotes in the string. |
+ if (list_value_[i].type() == STRING) |
+ result += std::string("\"") + list_value_[i].ToString() + "\""; |
+ else |
+ result += list_value_[i].ToString(); |
+ } |
+ result.push_back(']'); |
+ return result; |
+ } |
+ } |
+ return std::string(); |
+} |
+ |
+bool Value::VerifyTypeIs(Type t, Err* err) const { |
+ if (type_ == t) |
+ return true; |
+ |
+ *err = Err(origin(), std::string("This is not a ") + DescribeType(t) + "."); |
+ return false; |
+} |
+ |
+bool Value::operator==(const Value& other) const { |
+ if (type_ != other.type_) |
+ return false; |
+ |
+ switch (type_) { |
+ case Value::INTEGER: |
+ return int_value() == other.int_value(); |
+ case Value::STRING: |
+ return string_value() == other.string_value(); |
+ case Value::LIST: |
+ if (list_value().size() != other.list_value().size()) |
+ return false; |
+ for (size_t i = 0; i < list_value().size(); i++) { |
+ if (list_value()[i] != other.list_value()[i]) |
+ return false; |
+ } |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+bool Value::operator!=(const Value& other) const { |
+ return !operator==(other); |
+} |