| 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);
|
| +}
|
|
|