Added wxSharedPtr<T>

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51102 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2008-01-08 10:51:28 +00:00
parent 7d23dd2812
commit 5200ca361e
4 changed files with 138 additions and 1 deletions

View File

@@ -507,6 +507,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
wx/power.h wx/power.h
wx/process.h wx/process.h
wx/ptr_scpd.h wx/ptr_scpd.h
wx/ptr_shrd.h
wx/recguard.h wx/recguard.h
wx/regex.h wx/regex.h
wx/scopeguard.h wx/scopeguard.h
@@ -935,6 +936,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
wx/prntbase.h wx/prntbase.h
wx/progdlg.h wx/progdlg.h
wx/ptr_scpd.h wx/ptr_scpd.h
wx/ptr_shrd.h
wx/quantize.h wx/quantize.h
wx/rawbmp.h wx/rawbmp.h
wx/region.h wx/region.h

View File

@@ -382,8 +382,9 @@ wxWidgets provides a few smart pointer class templates.
\twocolwidtha{6cm} \twocolwidtha{6cm}
\begin{twocollist}\itemsep=0pt \begin{twocollist}\itemsep=0pt
\twocolitem{\helpref{wxObjectDataPtr<T>}{wxobjectdataptr}}{A shared pointer using intrusive reference counting} \twocolitem{\helpref{wxObjectDataPtr<T>}{wxobjectdataptr}}{A shared pointer (using intrusive reference counting)}
\twocolitem{\helpref{wxScopedPtr<T>}{wxscopedptrtemplate}}{A scoped pointer} \twocolitem{\helpref{wxScopedPtr<T>}{wxscopedptrtemplate}}{A scoped pointer}
\twocolitem{\helpref{wxSharedPtr<T>}{wxsharedptr}}{A shared pointer (using non-intrusive reference counting)}
\twocolitem{\helpref{wxWeakRef<T>}{wxweakref}}{A weak reference} \twocolitem{\helpref{wxWeakRef<T>}{wxweakref}}{A weak reference}
\end{twocollist} \end{twocollist}

View File

@@ -371,6 +371,7 @@
\input srchctrl.tex \input srchctrl.tex
\input sngchdlg.tex \input sngchdlg.tex
\input snglinst.tex \input snglinst.tex
\input sharedptr.tex
\input size.tex \input size.tex
\input sizeevt.tex \input sizeevt.tex
\input sizer.tex \input sizer.tex

133
include/wx/ptr_shrd.h Normal file
View File

@@ -0,0 +1,133 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/ptr_shrd.h
// Purpose: Shared pointer based on the counted_ptr<> template, which
// is in the public domain
// Author: Robert Roebling, Yonat Sharon
// RCS-ID: $Id: object.h 47254 2007-07-09 10:09:52Z VS $
// Copyright: Robert Roebling
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_SHARED_PTRH__
#define _WX_SHARED_PTRH__
#include "wx/defs.h"
#include "wx/atomic.h"
// ----------------------------------------------------------------------------
// wxSharedPtr: A smart pointer with non-intrusive reference counting.
// ----------------------------------------------------------------------------
template <class T>
class wxSharedPtr
{
public:
typedef T element_type;
wxEXPLICIT wxSharedPtr( T* ptr = NULL )
: m_ref(NULL)
{
if (ptr)
m_ref = new reftype(ptr);
}
~wxSharedPtr() { Release(); }
wxSharedPtr(const wxSharedPtr& tocopy) { Acquire(tocopy.m_ref); }
wxSharedPtr& operator=( const wxSharedPtr& tocopy )
{
if (this != &tocopy)
{
Release();
Acquire(tocopy.m_ref);
}
return *this;
}
wxSharedPtr& operator=( T* ptr )
{
if (get() != ptr)
{
Release();
if (ptr)
m_ref = new reftype(ptr);
}
return *this;
}
T& operator*() const
{
wxASSERT(m_ref != NULL);
wxASSERT(m_ref->m_ptr != NULL);
return *(m_ref->m_ptr);
}
T* operator->() const
{
wxASSERT(m_ref != NULL);
wxASSERT(m_ref->m_ptr != NULL);
return m_ref->m_ptr;
}
T* get() const
{
return m_ref ? m_ref->m_ptr : NULL;
}
void reset( T* ptr = NULL )
{
Release();
if (ptr)
m_ref = new reftype(ptr);
}
bool unique() const { return (m_ref ? m_ref->m_count == 1 : true); }
long use_count() const { return (m_ref ? (long)m_ref->m_count : 0); }
operator bool() const { return (get() != NULL); }
private:
struct reftype
{
reftype( T* ptr = NULL, unsigned count = 1 ) : m_ptr(ptr), m_count(count) {}
T* m_ptr;
wxAtomicInt m_count;
}* m_ref;
void Acquire(reftype* ref)
{
m_ref = ref;
if (ref)
wxAtomicInc( ref->m_count );
}
void Release()
{
if (m_ref)
{
wxAtomicDec( m_ref->m_count );
if (m_ref->m_count == 0)
{
delete m_ref->m_ptr;
delete m_ref;
}
m_ref = NULL;
}
}
};
template <class T, class U>
bool operator == (wxSharedPtr<T> const &a, wxSharedPtr<U> const &b )
{
return a.get() == b.get();
}
template <class T, class U>
bool operator != (wxSharedPtr<T> const &a, wxSharedPtr<U> const &b )
{
return a.get() != b.get();
}
#endif // _WX_SHARED_PTRH__