m_ref = new reftype(ptr);
}
+ template<typename Deleter>
+ wxEXPLICIT wxSharedPtr(T* ptr, Deleter d)
+ : m_ref(NULL)
+ {
+ if (ptr)
+ m_ref = new reftype_with_deleter<Deleter>(ptr, d);
+ }
+
~wxSharedPtr() { Release(); }
wxSharedPtr(const wxSharedPtr& tocopy) { Acquire(tocopy.m_ref); }
m_ref = new reftype(ptr);
}
+ template<typename Deleter>
+ void reset(T* ptr, Deleter d)
+ {
+ Release();
+ if (ptr)
+ m_ref = new reftype_with_deleter<Deleter>(ptr, d);
+ }
+
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); }
struct reftype
{
- reftype( T* ptr = NULL, unsigned count = 1 ) : m_ptr(ptr), m_count(count) {}
+ reftype(T* ptr) : m_ptr(ptr), m_count(1) {}
+ virtual ~reftype() {}
+ virtual void delete_ptr() { delete m_ptr; }
+
T* m_ptr;
wxAtomicInt m_count;
- }* m_ref;
+ };
+
+ template<typename Deleter>
+ struct reftype_with_deleter : public reftype
+ {
+ reftype_with_deleter(T* ptr, Deleter d) : reftype(ptr), m_deleter(d) {}
+ virtual void delete_ptr() { m_deleter(this->m_ptr); }
+
+ Deleter m_deleter;
+ };
+
+ reftype* m_ref;
void Acquire(reftype* ref)
{
{
if (!wxAtomicDec( m_ref->m_count ))
{
- delete m_ref->m_ptr;
+ m_ref->delete_ptr();
delete m_ref;
}
m_ref = NULL;
*/
wxEXPLICIT wxSharedPtr(T* ptr = NULL);
+ /**
+ Constructor.
+
+ Creates shared pointer from the raw pointer @a ptr and deleter @a d
+ and takes ownership of it.
+
+ @param ptr The raw pointer.
+ @param d Deleter - a functor that is called instead of delete to
+ free the @a ptr raw pointer when its reference count drops to
+ zero.
+
+ @since 3.0
+ */
+ template<typename Deleter>
+ wxEXPLICIT wxSharedPtr(T* ptr, Deleter d);
+
/**
Copy constructor.
*/
*/
void reset(T* ptr = NULL);
+ /**
+ Reset pointer to @a ptr.
+
+ If the reference count of the previously owned pointer was 1 it will be deleted.
+
+ @param ptr The new raw pointer.
+ @param d Deleter - a functor that is called instead of delete to
+ free the @a ptr raw pointer when its reference count drops to
+ zero.
+
+ @since 3.0
+ */
+ template<typename Deleter>
+ void reset(T* ptr, Deleter d);
+
/**
Returns @true if this is the only pointer pointing to its object.
*/