aboutsummaryrefslogtreecommitdiff
path: root/var.cc
diff options
context:
space:
mode:
Diffstat (limited to 'var.cc')
-rw-r--r--var.cc68
1 files changed, 68 insertions, 0 deletions
diff --git a/var.cc b/var.cc
new file mode 100644
index 0000000..9bac8a2
--- /dev/null
+++ b/var.cc
@@ -0,0 +1,68 @@
+#include "var.h"
+
+#include "value.h"
+
+UndefinedVar kUndefinedBuf;
+UndefinedVar* kUndefined = &kUndefinedBuf;
+
+Var::Var() {
+}
+
+Var::~Var() {
+}
+
+SimpleVar::SimpleVar(shared_ptr<string> v, const char* origin)
+ : v_(v), origin_(origin) {
+}
+
+void SimpleVar::Eval(Evaluator*, string* s) const {
+ *s += *v_;
+}
+
+string SimpleVar::DebugString() const {
+ return *v_;
+}
+
+RecursiveVar::RecursiveVar(Value* v, const char* origin)
+ : v_(v), origin_(origin) {
+}
+
+void RecursiveVar::Eval(Evaluator* ev, string* s) const {
+ v_->Eval(ev, s);
+}
+
+string RecursiveVar::DebugString() const {
+ return v_->DebugString();
+}
+
+UndefinedVar::UndefinedVar() {}
+
+void UndefinedVar::Eval(Evaluator*, string*) const {
+ // Nothing to do.
+}
+
+string UndefinedVar::DebugString() const {
+ return "*undefined*";
+}
+
+Vars::~Vars() {
+ for (auto p : *this) {
+ delete p.second;
+ }
+}
+
+Var* Vars::Lookup(StringPiece name) const {
+ auto found = find(name);
+ if (found == end())
+ return kUndefined;
+ return found->second;
+}
+
+void Vars::Assign(StringPiece name, Var* v) {
+ auto p = insert(make_pair(name, v));
+ if (!p.second) {
+ if (p.first->second->IsDefined())
+ delete p.first->second;
+ p.first->second = v;
+ }
+}