From 38f1526768e108c7e2e1da50d16115b46004b89f Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Wed, 17 Sep 2003 17:27:36 +0000
Subject: [PATCH] added tied scoped pointers

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23638 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/scpdptr.tex | 63 +++++++++++++++++++++++++++++++++++++--
 include/wx/ptr_scpd.h     | 27 +++++++++++++++++
 2 files changed, 88 insertions(+), 2 deletions(-)

diff --git a/docs/latex/wx/scpdptr.tex b/docs/latex/wx/scpdptr.tex
index fe3d8cebaf..8f9ebf4185 100644
--- a/docs/latex/wx/scpdptr.tex
+++ b/docs/latex/wx/scpdptr.tex
@@ -86,11 +86,19 @@ Once again, in this cass \texttt{CLASSNAME} will be \texttt{TYPEPtr}.
 
 \membersection{wxScopedPtr::wxScopedPtr}
 
-\func{}{wxScopedPtr}{\param{type}{ * T = NULL}}
+\func{}{explicit wxScopedPtr}{\param{type}{ * T = NULL}}
 
-Creates the smart pointer with the given pointer or none if NULL.  On
+Creates the smart pointer with the given pointer or none if {\tt NULL}.  On
 compilers that support it, this uses the explicit keyword.
 
+
+\membersection{wxScopedPtr::\destruct{wxScopedPtr}
+
+\func{}{\destruct{wxScopedPtr}}{\void}
+
+Destructor frees the pointer help by this object if it is not {\t NULL}.
+
+
 \membersection{wxScopedPtr::release}
 
 \func{T *}{release}{\void}
@@ -108,6 +116,7 @@ Deletes the currently held pointer and sets it to {\it p} or to NULL if no
 arguments are specified. This function does check to make sure that the
 pointer you are assigning is not the same pointer that is already stored.
 
+
 \membersection{wxScopedPtr::operator *}
 
 \func{const T\&}{operator *}{\void}
@@ -116,6 +125,7 @@ This operator works like the standard C++ pointer operator to return the object
 being pointed to by the pointer.  If the pointer is NULL or invalid this will
 crash.
 
+
 \membersection{wxScopedPtr::operator -$>$} % TODO
 
 \func{const T*}{operator -$>$}{\void} % TODO
@@ -123,6 +133,7 @@ crash.
 This operator works like the standard C++ pointer operator to return the pointer
 in the smart pointer or NULL if it is empty.
 
+
 \membersection{wxScopedPtr::get}
 
 \func{const T*}{get}{\void}
@@ -130,6 +141,7 @@ in the smart pointer or NULL if it is empty.
 This operator gets the pointer stored in the smart pointer or returns NULL if
 there is none.
 
+
 \membersection{wxScopedPtr::swap}
 
 \func{\void}{swap}{\param{wxScopedPtr}{ \& other}}
@@ -137,3 +149,50 @@ there is none.
 Swap the pointer inside the smart pointer with {\it other}. The pointer being
 swapped must be of the same type (hence the same class name).
 
+
+
+
+%%%%%%% wxScopedTiedPtr %%%%%%%
+\section{\class{wxScopedTiedPtr}}\label{wxscopedtiedptr}
+
+This is a variation on the topic of \helpref{wxScopedPtr}{wxscopedptr}. This
+class is also a smart pointer but in addition it ``ties'' the pointer value to
+another variable. In other words, during the life time of this class the value
+of that variable is set to be the same as the value of the pointer itself and
+it is reset to its old value when the object is destroyed. This class is
+especially useful when converting the existing code (which may already store
+the pointers value in some variable) to the smart pointers.
+
+\wxheading{Example}
+
+\wxheading{Derives from}
+
+\helpref{wxScopedPtr}{wxscopedptr}
+
+\wxheading{Include files}
+
+<wx/ptr\_scpd.h>
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+\membersection{wxScopedTiedPtr::wxScopedTiedPtr}\label{wxscopedtiedptrctor}
+
+\func{}{wxScopedTiedPtr}{\param{T **}{ppTie}, \param{T *}{ptr}}
+
+Constructor creates a smart pointer initialized with \arg{ptr} and stores 
+\arg{ptr} in the location specified by \arg{ppTie} which must not be 
+{\tt NULL}.
+
+\membersection{wxScopedTiedPtr::\destruct{wxScopedTiedPtr}}\label{wxscopedtiedptrdtor}
+
+\func{}{\destruct{wxScopedTiedPtr}}{\void}
+
+Destructor frees the pointer help by this object and restores the value stored
+at the tied location (as specified in the \helpref{constructor}{wxscopedtiedptrctor})
+to the old value.
+
+Warning: this location may now contain an uninitialized value if it hadn't been
+initialized previously, in particular don't count on it magically being 
+{\tt NULL}!
+
+
diff --git a/include/wx/ptr_scpd.h b/include/wx/ptr_scpd.h
index ff287cfad4..d0a24daec3 100644
--- a/include/wx/ptr_scpd.h
+++ b/include/wx/ptr_scpd.h
@@ -182,5 +182,32 @@ void name::reset(T * p){                \
     }                                   \
 }
 
+// ----------------------------------------------------------------------------
+// "Tied" scoped pointer: same as normal one but also sets the value of
+//                        some other variable to the pointer value
+// ----------------------------------------------------------------------------
+
+#define wxDEFINE_TIED_SCOPED_PTR_TYPE(T)                                      \
+    wxDEFINE_SCOPED_PTR_TYPE(T);                                              \
+    class T ## TiedPtr : public T ## Ptr                                      \
+    {                                                                         \
+    public:                                                                   \
+        T ## TiedPtr(T **pp, T *p)                                            \
+            : T ## Ptr(p), m_pp(pp)                                           \
+        {                                                                     \
+            m_pOld = *pp;                                                     \
+            *pp = p;                                                          \
+        }                                                                     \
+                                                                              \
+        ~ T ## TiedPtr()                                                      \
+        {                                                                     \
+            *m_pp = m_pOld;                                                   \
+        }                                                                     \
+                                                                              \
+    private:                                                                  \
+        T **m_pp;                                                             \
+        T *m_pOld;                                                            \
+    }
+
 #endif // __WX_SCOPED_POINTER__
 
-- 
2.50.0

