diff options
Diffstat (limited to 'gdb/common')
-rw-r--r-- | gdb/common/scoped_restore.h | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/gdb/common/scoped_restore.h b/gdb/common/scoped_restore.h index ae7a49f..e7dbca9 100644 --- a/gdb/common/scoped_restore.h +++ b/gdb/common/scoped_restore.h @@ -21,8 +21,23 @@ #define SCOPED_RESTORE_H /* Base class for scoped_restore_tmpl. */ -struct scoped_restore_base +class scoped_restore_base { +public: + /* This informs the (scoped_restore_tmpl<T>) dtor that you no longer + want the original value restored. */ + void release () const + { m_saved_var = NULL; } + +protected: + scoped_restore_base (void *saved_var) + : m_saved_var (saved_var) + {} + + /* The type-erased saved variable. This is here so that clients can + call release() on a "scoped_restore" local, which is a typedef to + a scoped_restore_base. See below. */ + mutable void *m_saved_var; }; /* A convenience typedef. Users of make_scoped_restore declare the @@ -40,7 +55,7 @@ class scoped_restore_tmpl : public scoped_restore_base of *VAR. *VAR will be restored when this scoped_restore object is destroyed. */ scoped_restore_tmpl (T *var) - : m_saved_var (var), + : scoped_restore_base (var), m_saved_value (*var) { } @@ -52,14 +67,14 @@ class scoped_restore_tmpl : public scoped_restore_base E.g.: T='base'; T2='derived'. */ template <typename T2> scoped_restore_tmpl (T *var, T2 value) - : m_saved_var (var), + : scoped_restore_base (var), m_saved_value (*var) { *var = value; } scoped_restore_tmpl (const scoped_restore_tmpl<T> &other) - : m_saved_var (other.m_saved_var), + : scoped_restore_base {other.m_saved_var}, m_saved_value (other.m_saved_value) { other.m_saved_var = NULL; @@ -67,18 +82,19 @@ class scoped_restore_tmpl : public scoped_restore_base ~scoped_restore_tmpl () { - if (m_saved_var != NULL) - *m_saved_var = m_saved_value; + if (saved_var () != NULL) + *saved_var () = m_saved_value; } - private: +private: + /* Return a pointer to the saved variable with its type + restored. */ + T *saved_var () + { return static_cast<T *> (m_saved_var); } /* No need for this. It is intentionally not defined anywhere. */ scoped_restore_tmpl &operator= (const scoped_restore_tmpl &); - /* The saved variable. */ - mutable T *m_saved_var; - /* The saved value. */ const T m_saved_value; }; |