-/* $Id$
-
-This file is part of libmspcore
-Copyright © 2006-2007, 2010 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
#ifndef MSP_CORE_REFPTR_H_
#define MSP_CORE_REFPTR_H_
template<typename T>
class RefPtr
{
+ template<typename U> friend class RefPtr;
+
private:
enum
{
KEEP = 1U<<(sizeof(unsigned)*8-1)
};
+ T *data;
+ unsigned *count;
+
public:
RefPtr(): data(0), count(0) { }
RefPtr(T *d): data(d), count(data ? new unsigned(1) : 0) { }
+private:
+ RefPtr(T *d, unsigned *c): data(d), count(d ? c : 0) { incref(); }
- // Must have this or the compiler will generate a default copy-c'tor
+public:
+ /* Must have this or the compiler will generate a default copy-c'tor despite
+ the template version */
RefPtr(const RefPtr &p): data(p.data), count(p.count) { incref(); }
template<typename U>
RefPtr(const RefPtr<U> &p): data(p.data), count(p.count) { incref(); }
+ ~RefPtr() { decref(); }
+
RefPtr &operator=(T *d)
{
decref();
template<typename U>
RefPtr &operator=(const RefPtr<U> &p) { return assign(p); }
-
- ~RefPtr() { decref(); }
- /**
- Makes the RefPtr release its reference of the data. Note that if there are
- other RefPtrs left with the same data, it might still get deleted
- automatically.
- */
+private:
+ template<typename U>
+ RefPtr &assign(const RefPtr<U> &p)
+ {
+ decref();
+ data = p.data;
+ count = p.count;
+ incref();
+ return *this;
+ }
+
+public:
+ /** Makes the RefPtr release its reference of the data without deleting it.
+ Note that if there are other RefPtrs left with the same data, it might
+ still get deleted automatically. */
T *release()
{
T *d = data;
return d;
}
- /**
- Marks the data to not be deleted. This affects all RefPtrs with the same
- data.
- */
+ /** Marks the data to not be deleted. This affects all RefPtrs with the
+ same data. */
void keep()
{
if(count)
static RefPtr<T> cast_dynamic(const RefPtr<U> &p)
{ return RefPtr<T>(dynamic_cast<T *>(p.data), p.count); }
- template<typename U> friend class RefPtr;
private:
- T *data;
- unsigned *count;
-
- RefPtr(T *d, unsigned *c): data(d), count(d ? c : 0) { incref(); }
-
- template<typename U>
- RefPtr &assign(const RefPtr<U> &p)
- {
- decref();
- data = p.data;
- count = p.count;
- incref();
- return *this;
- }
-
void incref()
{
if(!count) return;