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:
@@ -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
|
||||||
|
@@ -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}
|
||||||
|
|
||||||
|
@@ -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
133
include/wx/ptr_shrd.h
Normal 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__
|
Reference in New Issue
Block a user