From 53de92ca887e4386d8d6acb462be4e4a7978a90b Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Sun, 9 Dec 2012 09:34:27 +0100 Subject: Initial check-in. --- dynvars-impl.hpp | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 dynvars-impl.hpp (limited to 'dynvars-impl.hpp') diff --git a/dynvars-impl.hpp b/dynvars-impl.hpp new file mode 100644 index 0000000..5890888 --- /dev/null +++ b/dynvars-impl.hpp @@ -0,0 +1,80 @@ +// Copyright 2012, Matthias Andreas Benkard. + +#pragma once + +#ifndef DYNVARS_IMPL_HPP +#define DYNVARS_IMPL_HPP + +#include +#include +#include +#include +#include +#include +#include + +#include "dynvars.hpp" + +namespace dynvars { + +using namespace ::std; + +template +dynvar::dynvar(T val) { + this->push(val); +} + +template +dynvar& dynvar::operator =(T val) { + if (!value_stack.empty()) { + this->pop(); + } + this->push(val); + return *this; +} + +template +void dynvar::push(T val) { + value_stack.push_front(val); +} + +template +void dynvar::pop() { + value_stack.pop_front(); +} + +template +dynvar::operator bool() const { + return !value_stack.empty(); +} + +template +T& dynvar::operator *() { + return value_stack.front(); +} + +template +T* dynvar::operator ->() { + return &value_stack.front(); +} + +template +dyn::dyn(dynvar& var, R val) : myvar(var) { + myvar.push(val); +} + +template +dyn::~dyn() { + myvar.pop(); +} + +template +T +with(dynvar& var, R val, function f) { + dyn d_(var, val); + return f(); +} + +} + +#endif //DYNVARS_IMPL_HPP -- cgit v1.2.3