aboutsummaryrefslogtreecommitdiff
path: root/var.cc
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-18 16:18:13 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-19 12:49:19 +0900
commitcf0cd68ef4d2b8268ade22418c17e0079e9c85e1 (patch)
tree2901ced625193a66e3f993ba981f92a7375cf6e5 /var.cc
parent0ec7dacff3bd7b106ad68deb29013405da1409bf (diff)
downloadkati-cf0cd68ef4d2b8268ade22418c17e0079e9c85e1.tar.gz
[C++] Implement foreach
Diffstat (limited to 'var.cc')
-rw-r--r--var.cc18
1 files changed, 18 insertions, 0 deletions
diff --git a/var.cc b/var.cc
index ee708f4..be1db17 100644
--- a/var.cc
+++ b/var.cc
@@ -82,3 +82,21 @@ void Vars::Assign(StringPiece name, Var* v) {
p.first->second = v;
}
}
+
+ScopedVar::ScopedVar(Vars* vars, StringPiece name, Var* var)
+ : vars_(vars), orig_(NULL) {
+ auto p = vars->insert(make_pair(name, var));
+ iter_ = p.first;
+ if (!p.second) {
+ orig_ = iter_->second;
+ iter_->second = var;
+ }
+}
+
+ScopedVar::~ScopedVar() {
+ if (orig_) {
+ iter_->second = orig_;
+ } else {
+ vars_->erase(iter_);
+ }
+}