Index: tools/gn/value.h |
diff --git a/tools/gn/value.h b/tools/gn/value.h |
index ee201c45e7b6a8065f3d014724eade3f79eccb8b..e6a98132972d2619a0c9e39e0192d1511566b788 100644 |
--- a/tools/gn/value.h |
+++ b/tools/gn/value.h |
@@ -5,8 +5,11 @@ |
#ifndef TOOLS_GN_VALUE_H_ |
#define TOOLS_GN_VALUE_H_ |
+#include <map> |
+ |
#include "base/basictypes.h" |
#include "base/logging.h" |
+#include "base/memory/scoped_ptr.h" |
#include "base/strings/string_piece.h" |
#include "tools/gn/err.h" |
@@ -22,7 +25,7 @@ class Value { |
INTEGER, |
STRING, |
LIST, |
- SCOPE |
+ SCOPE, |
}; |
Value(); |
@@ -31,10 +34,18 @@ class Value { |
Value(const ParseNode* origin, int64 int_val); |
Value(const ParseNode* origin, std::string str_val); |
Value(const ParseNode* origin, const char* str_val); |
- Value(const ParseNode* origin, Scope* scope); // Non-owning ptr. |
- // (must outlive Value.) |
+ // Values "shouldn't" have null scopes when type == Scope, so be sure to |
+ // always set one. However, this is not asserted since there are some |
+ // use-cases for creating values and immediately setting the scope on it. So |
+ // you can pass a null scope here if you promise to set it before any other |
+ // code gets it (code will generally assume the scope is not null). |
+ Value(const ParseNode* origin, scoped_ptr<Scope> scope); |
+ |
+ Value(const Value& other); |
~Value(); |
+ Value& operator=(const Value& other); |
+ |
Type type() const { return type_; } |
// Returns a string describing the given type. |
@@ -86,12 +97,13 @@ class Value { |
Scope* scope_value() { |
DCHECK(type_ == SCOPE); |
- return scope_value_; |
+ return scope_value_.get(); |
} |
const Scope* scope_value() const { |
DCHECK(type_ == SCOPE); |
- return scope_value_; |
+ return scope_value_.get(); |
} |
+ void SetScopeValue(scoped_ptr<Scope> scope); |
// Converts the given value to a string. Returns true if strings should be |
// quoted or the ToString of a string should be the string itself. |
@@ -106,12 +118,16 @@ class Value { |
bool operator!=(const Value& other) const; |
private: |
+ // This are a lot of objects associated with every Value that need |
+ // initialization and tear down every time. It might be more efficient to |
+ // create a union of ManualConstructor objects (see SmallMap) and only |
+ // use the one we care about. |
Type type_; |
std::string string_value_; |
bool boolean_value_; |
int64 int_value_; |
std::vector<Value> list_value_; |
- Scope* scope_value_; // Non-owning. |
+ scoped_ptr<Scope> scope_value_; |
const ParseNode* origin_; |
}; |