#include </home/zeitlin/src/wx/github/interface/wx/object.h>
This is an helper template class primarily written to avoid memory leaks because of missing calls to wxRefCounter::DecRef() and wxObjectRefData::DecRef().
Despite the name this template can actually be used as a smart pointer for any class implementing the reference counting interface which only consists of the two methods T::IncRef() and T::DecRef().
The difference to wxSharedPtr<T> is that wxObjectDataPtr<T> relies on the reference counting to be in the class pointed to, where instead wxSharedPtr<T> implements the reference counting itself.
Below is an example illustrating how to implement reference counted data using wxRefCounter and wxObjectDataPtr<T> with copy-on-write semantics.
class MyCarRefData: public wxRefCounter { public: MyCarRefData( int price = 0 ) : m_price(price) { } MyCarRefData( const MyCarRefData& data ) : m_price(data.m_price) { } void SetPrice( int price ) { m_price = price; } int GetPrice() const { return m_price; } protected: int m_price; }; class MyCar { public: // initializes this MyCar assigning to the // internal data pointer a new instance of MyCarRefData MyCar( int price = 0 ) : m_data( new MyCarRefData(price) ) { } MyCar& operator =( const MyCar& tocopy ) { // shallow copy: this is just a fast copy of pointers; the real // memory-consuming data which typically is stored inside // MyCarRefData is not copied here! m_data = tocopy.m_data; return *this; } bool operator == ( const MyCar& other ) const { if (m_data.get() == other.m_data.get()) return true; // this instance and the 'other' one share the // same MyCarRefData data... return (m_data.GetPrice() == other.m_data.GetPrice()); } void SetPrice( int price ) { // make sure changes to this class do not affect other instances // currently sharing our same refcounted data: UnShare(); m_data->SetPrice( price ); } int GetPrice() const { return m_data->GetPrice(); } wxObjectDataPtr<MyCarRefData> m_data; protected: void UnShare() { if (m_data->GetRefCount() == 1) return; m_data.reset( new MyCarRefData( *m_data ) ); } };
Public Member Functions | |
wxObjectDataPtr (T *ptr=NULL) | |
Constructor. | |
wxObjectDataPtr (const wxObjectDataPtr< T > &tocopy) | |
This copy constructor increases the count of the reference counted object to which tocopy points and then this class will point to, as well. | |
~wxObjectDataPtr () | |
Decreases the reference count of the object to which this class points. | |
T * | get () const |
Gets a pointer to the reference counted object to which this class points. | |
void | reset (T *ptr) |
Reset this class to ptr which points to a reference counted object and calls T::DecRef() on the previously owned object. | |
operator unspecified_bool_type () const | |
Conversion to a boolean expression (in a variant which is not convertable to anything but a boolean expression). | |
T & | operator* () const |
Returns a reference to the object. | |
T * | operator-> () const |
Returns a pointer to the reference counted object to which this class points. | |
wxObjectDataPtr< T > & | operator= (const wxObjectDataPtr< T > &tocopy) |
Assignment operator. | |
wxObjectDataPtr< T > & | operator= (T *ptr) |
Assignment operator. |
wxObjectDataPtr< T >::wxObjectDataPtr | ( | T * | ptr = NULL | ) |
Constructor.
ptr is a pointer to the reference counted object to which this class points. If ptr is not NULL T::IncRef() will be called on the object.
wxObjectDataPtr< T >::wxObjectDataPtr | ( | const wxObjectDataPtr< T > & | tocopy | ) |
This copy constructor increases the count of the reference counted object to which tocopy points and then this class will point to, as well.
wxObjectDataPtr< T >::~wxObjectDataPtr | ( | ) |
Decreases the reference count of the object to which this class points.
T* wxObjectDataPtr< T >::get | ( | ) | const |
Gets a pointer to the reference counted object to which this class points.
wxObjectDataPtr< T >::operator unspecified_bool_type | ( | ) | const |
Conversion to a boolean expression (in a variant which is not convertable to anything but a boolean expression).
If this class contains a valid pointer it will return true, if it contains a NULL pointer it will return false.
T& wxObjectDataPtr< T >::operator* | ( | ) | const |
Returns a reference to the object.
If the internal pointer is NULL this method will cause an assert in debug mode.
T* wxObjectDataPtr< T >::operator-> | ( | ) | const |
Returns a pointer to the reference counted object to which this class points.
If this the internal pointer is NULL, this method will assert in debug mode.
wxObjectDataPtr<T>& wxObjectDataPtr< T >::operator= | ( | const wxObjectDataPtr< T > & | tocopy | ) |
Assignment operator.
wxObjectDataPtr<T>& wxObjectDataPtr< T >::operator= | ( | T * | ptr | ) |
Assignment operator.
void wxObjectDataPtr< T >::reset | ( | T * | ptr | ) |
Reset this class to ptr which points to a reference counted object and calls T::DecRef() on the previously owned object.