blob: cb78faadcfda8bea054f7497d877bdfbf4451b1d [file] [log] [blame]
// 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);
}