aboutsummaryrefslogtreecommitdiff
path: root/var.cc
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-06 03:52:48 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-18 11:25:42 +0900
commit776ca3085c44e6570813270df75278849c37d400 (patch)
tree6dc3f2d468cfd860347f2f9d519f49c2a38d4c64 /var.cc
parenta3caa8166baeb348f817eb1b4fa2e81672b3d77f (diff)
[C++] The first commit for C++ version
16 tests out of 169 are passing.
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;
+ }
+}