diff options
| author | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-06 03:52:48 +0900 |
|---|---|---|
| committer | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-18 11:25:42 +0900 |
| commit | 776ca3085c44e6570813270df75278849c37d400 (patch) | |
| tree | 6dc3f2d468cfd860347f2f9d519f49c2a38d4c64 /var.cc | |
| parent | a3caa8166baeb348f817eb1b4fa2e81672b3d77f (diff) | |
[C++] The first commit for C++ version
16 tests out of 169 are passing.
Diffstat (limited to 'var.cc')
| -rw-r--r-- | var.cc | 68 |
1 files changed, 68 insertions, 0 deletions
@@ -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; + } +} |
