diff options
author | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2012-12-09 09:34:27 +0100 |
---|---|---|
committer | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2012-12-09 09:34:27 +0100 |
commit | 53de92ca887e4386d8d6acb462be4e4a7978a90b (patch) | |
tree | 663907e7bada79c3c973b5ecefcce6ea52fa3561 /dynvars-impl.hpp |
Initial check-in.
Diffstat (limited to 'dynvars-impl.hpp')
-rw-r--r-- | dynvars-impl.hpp | 80 |
1 files changed, 80 insertions, 0 deletions
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 <cstdlib> +#include <cstdio> +#include <iostream> +#include <functional> +#include <memory> +#include <future> +#include <list> + +#include "dynvars.hpp" + +namespace dynvars { + +using namespace ::std; + +template <typename T> +dynvar<T>::dynvar(T val) { + this->push(val); +} + +template <typename T> +dynvar<T>& dynvar<T>::operator =(T val) { + if (!value_stack.empty()) { + this->pop(); + } + this->push(val); + return *this; +} + +template <typename T> +void dynvar<T>::push(T val) { + value_stack.push_front(val); +} + +template <typename T> +void dynvar<T>::pop() { + value_stack.pop_front(); +} + +template <typename T> +dynvar<T>::operator bool() const { + return !value_stack.empty(); +} + +template <typename T> +T& dynvar<T>::operator *() { + return value_stack.front(); +} + +template <typename T> +T* dynvar<T>::operator ->() { + return &value_stack.front(); +} + +template <typename R> +dyn<R>::dyn(dynvar<R>& var, R val) : myvar(var) { + myvar.push(val); +} + +template <typename R> +dyn<R>::~dyn() { + myvar.pop(); +} + +template <typename R, typename T> +T +with(dynvar<R>& var, R val, function<T ()> f) { + dyn<R> d_(var, val); + return f(); +} + +} + +#endif //DYNVARS_IMPL_HPP |