From 89969a91289c3c99b6d55c2ac918ddb8a3f0f0bc Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Mon, 7 Jan 2008 12:09:22 +0000 Subject: [PATCH] Templatize wxScopedPtr git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51070 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/category.tex | 3 +- docs/latex/wx/classes.tex | 1 + docs/latex/wx/scpdptr.tex | 3 ++ docs/latex/wx/sharedptr.tex | 71 ++++++++++++++++++++++++++++++++ include/wx/ptr_scpd.h | 80 +++++++++++++++++++++++++++++++++---- 5 files changed, 149 insertions(+), 9 deletions(-) create mode 100644 docs/latex/wx/sharedptr.tex diff --git a/docs/latex/wx/category.tex b/docs/latex/wx/category.tex index 81cad80b67..1af5871f2a 100644 --- a/docs/latex/wx/category.tex +++ b/docs/latex/wx/category.tex @@ -382,8 +382,9 @@ wxWidgets provides a few smart pointer class templates. \twocolwidtha{6cm} \begin{twocollist}\itemsep=0pt -\twocolitem{\helpref{wxWeakRef}{wxweakref}}{A weak reference} \twocolitem{\helpref{wxObjectDataPtr}{wxobjectdataptr}}{A shared pointer using intrusive reference counting} +\twocolitem{\helpref{wxScopedPtr}{wxscopedptrtemplate}}{A scoped pointer} +\twocolitem{\helpref{wxWeakRef}{wxweakref}}{A weak reference} \end{twocollist} {\large {\bf Run-time class information system}} diff --git a/docs/latex/wx/classes.tex b/docs/latex/wx/classes.tex index b15b8c5ad3..055a5b3309 100644 --- a/docs/latex/wx/classes.tex +++ b/docs/latex/wx/classes.tex @@ -358,6 +358,7 @@ \input sashwin.tex \input scpdarry.tex \input scpdptr.tex +\input scopedptr.tex \input screendc.tex \input scrolbar.tex \input scrolwin.tex diff --git a/docs/latex/wx/scpdptr.tex b/docs/latex/wx/scpdptr.tex index 1a5b04bc25..47c36fcf50 100644 --- a/docs/latex/wx/scpdptr.tex +++ b/docs/latex/wx/scpdptr.tex @@ -4,6 +4,9 @@ This is a simple scoped smart pointer implementation that is similar to the \urlref{Boost}{http://www.boost.org/} smart pointers but rewritten to use macros instead. +Since wxWidgets 2.9.0 there is also a templated version of this class +with the same name. See \helpref{wxScopedPtr}{wxscopedptrtemplate}. + A smart pointer holds a pointer to an object. The memory used by the object is deleted when the smart pointer goes out of scope. This class is different from the \texttt{std::auto\_ptr<>} in so far as it doesn't provide copy constructor diff --git a/docs/latex/wx/sharedptr.tex b/docs/latex/wx/sharedptr.tex new file mode 100644 index 0000000000..2a4c4cb7f6 --- /dev/null +++ b/docs/latex/wx/sharedptr.tex @@ -0,0 +1,71 @@ +\section{\class{wxSharedPtr}}\label{wxsharedptr} + +A smart pointer with non-intrusive reference counting. + +\wxheading{Derived from} + +No base class + +\wxheading{Include files} + + + +\wxheading{Data structures} + +{\small \begin{verbatim} +typedef T element\_type +\end{verbatim}} + +\latexignore{\rtfignore{\wxheading{Members}}} + + +\membersection{wxSharedPtr::wxSharedPtr}\label{wxsharedptrwxsharedptr} + +\func{wxEXPLICIT}{wxSharedPtr}{\param{T* }{ptr = NULL}} + +\func{}{wxSharedPtr}{\param{const wxSharedPtr\& }{tocopy}} + +Constructors. + +\membersection{wxSharedPtr::\destruct{wxSharedPtr}}\label{wxsharedptrdtor} + +\func{}{\destruct{wxSharedPtr}}{\void} + +Destructor. + +\membersection{wxSharedPtr::get}\label{wxsharedptrget} + +\constfunc{T*}{get}{\void} + +Returns pointer to its object or NULL. + +\membersection{wxSharedPtr::operator*}\label{wxsharedptroperatorptrt} + +\constfunc{T\&}{operator*}{\void} + +Returns pointer to its object or NULL. + +\membersection{wxSharedPtr::operator->}\label{wxsharedptroperatorderef} + +\constfunc{T*}{operator->}{\void} + +Returns pointer to its object or NULL. + +\membersection{wxSharedPtr::operator=}\label{wxsharedptroperatorassign} + +\func{wxSharedPtr\& operator}{operator=}{\param{const wxSharedPtr\& }{tocopy}} + +Assignment operator. + +\membersection{wxSharedPtr::unique}\label{wxsharedptrunique} + +\constfunc{bool}{unique}{\void} + +Returns true if this is the only pointer pointing to its object. + +\membersection{wxSharedPtr::use\_count}\label{wxsharedptruse\_count} + +\constfunc{long}{use\_count}{\void} + +Returns the number of pointers pointing to its object. + diff --git a/include/wx/ptr_scpd.h b/include/wx/ptr_scpd.h index 2ebb6a6732..100e6bdd0a 100644 --- a/include/wx/ptr_scpd.h +++ b/include/wx/ptr_scpd.h @@ -30,6 +30,76 @@ #include "wx/defs.h" +// ---------------------------------------------------------------------------- +// wxScopedPtr: A scoped pointer +// ---------------------------------------------------------------------------- + +template +class wxScopedPtr +{ +private: + T * m_ptr; + + wxScopedPtr(wxScopedPtr const &); + wxScopedPtr & operator=(wxScopedPtr const &); + +public: + typedef T element_type; + + wxEXPLICIT wxScopedPtr(T * ptr = NULL) + : m_ptr(ptr) { } + + ~wxScopedPtr() + { + if (m_ptr) + delete m_ptr; + } + + void reset(T * ptr = NULL) + { + if (m_ptr != ptr) + { + delete m_ptr; + m_ptr = ptr; + } + } + + T *release() + { + T *ptr = m_ptr; + m_ptr = NULL; + return ptr; + } + + T & operator*() const + { + wxASSERT(m_ptr != NULL); + return *m_ptr; + } + + T * operator->() const + { + wxASSERT(m_ptr != NULL); + return m_ptr; + } + + T * get() const + { + return m_ptr; + } + + void swap(wxScopedPtr & ot) + { + T * tmp = ot.m_ptr; + ot.m_ptr = m_ptr; + m_ptr = tmp; + } +}; + +// ---------------------------------------------------------------------------- +// old macro based implementation +// ---------------------------------------------------------------------------- + /* checked deleters are used to make sure that the type being deleted is really a complete type.: otherwise sizeof() would result in a compile-time error @@ -62,16 +132,10 @@ delete [] ptr; \ } wxPOST_NO_WARNING_SCOPE(scope_var2) -/* These scoped pointers are *not* assignable and cannot be used - within a container. Look for wxDECLARE_SHARED_PTR for this - functionality. - - In addition, the type being used *must* be complete at the time +/* The type being used *must* be complete at the time that wxDEFINE_SCOPED_* is called or a compiler error will result. This is because the class checks for the completeness of the type - being used. -*/ - + being used. */ #define wxDECLARE_SCOPED_PTR(T, name) \ class name \ -- 2.45.2