diff options
-rw-r--r-- | crawl-ref/source/unwind.h | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/crawl-ref/source/unwind.h b/crawl-ref/source/unwind.h index 426d629225..c13dda320b 100644 --- a/crawl-ref/source/unwind.h +++ b/crawl-ref/source/unwind.h @@ -1,29 +1,46 @@ #ifndef UNWIND_H #define UNWIND_H +/** Type that gives an lvalue dynamically-scoped temporary value. An + * unwind_var remembers the old value of a variable or other writable lvalue, + * and restores the original (or a specified) value when the unwind_var goes + * out of scope or is otherwise destroyed. + */ template <typename T> class unwind_var { public: - unwind_var(T &val_, T newval, T reset_to) : val(val_), oldval(reset_to) + /** Wrap the lvalue val_ and on unwinding restore its original value. */ + unwind_var(T &val_) : val(val_), oldval(val_) { } + + /** Wrap the lvalue val_, assign it the temporary value newval, and + * on unwinding restore its original value. + */ + unwind_var(T &val_, T newval) : val(val_), oldval(val_) { val = newval; } - unwind_var(T &val_, T newval) : val(val_), oldval(val_) + + /** Wrap the lvalue val_, assign it the temporary value newval, and + * on unwinding assign it the value reset_to. + */ + unwind_var(T &val_, T newval, T reset_to) : val(val_), oldval(reset_to) { val = newval; } - unwind_var(T &val_) : val(val_), oldval(val_) { } + ~unwind_var() { val = oldval; } + /** Get the current (temporary) value of the wrapped lvalue. */ T value() const { return val; } + /** Get the value that will be used to restore the wrapped lvalue. */ T original_value() const { return oldval; |