template<typename U> friend class WeakPtr;
private:
- T *data;
- RefCounts *counts;
+ T *data = nullptr;
+ RefCounts *counts = nullptr;
public:
- RefPtr(): data(0), counts(0) { }
- RefPtr(T *d): data(d), counts(data ? new RefCounts : 0) { incref(); }
+ RefPtr() = default;
+ RefPtr(T *d): data(d), counts(data ? new RefCounts : nullptr) { incref(); }
private:
- RefPtr(T *d, RefCounts *c): data(d), counts(d ? c : 0) { incref(); }
+ RefPtr(T *d, RefCounts *c): data(d), counts(d ? c : nullptr) { incref(); }
public:
/* Must have this or the compiler will generate a default copy-c'tor despite
RefPtr(const RefPtr<U> &p): data(p.data), counts(p.counts) { incref(); }
template<typename U>
- RefPtr(const WeakPtr<U> &p): data(p.get()), counts(data ? p.counts : 0) { incref(); }
+ RefPtr(const WeakPtr<U> &p): data(p.get()), counts(data ? p.counts : nullptr) { incref(); }
~RefPtr() { decref(); }
T *get() const { return data; }
T &operator*() const { return *data; }
T *operator->() const { return data; }
- operator bool() const { return data!=0; }
+ explicit operator bool() const { return data; }
unsigned refcount() const { return (data ? counts->count : 0); }
template<typename U> friend class WeakPtr;
private:
- T *data;
- RefCounts *counts;
+ T *data = nullptr;
+ RefCounts *counts = nullptr;
public:
- WeakPtr(): data(0), counts(0) { }
+ WeakPtr() = default;
private:
- WeakPtr(T *d, RefCounts *c): data(d), counts(d ? c : 0) { incref(); }
+ WeakPtr(T *d, RefCounts *c): data(d), counts(d ? c : nullptr) { incref(); }
public:
- WeakPtr(const WeakPtr &p): data(p.get()), counts(data ? p.counts : 0) { incref(); }
+ WeakPtr(const WeakPtr &p): data(p.get()), counts(data ? p.counts : nullptr) { incref(); }
template<typename U>
- WeakPtr(const WeakPtr<U> &p): data(p.get()), counts(data ? p.counts : 0) { incref(); }
+ WeakPtr(const WeakPtr<U> &p): data(p.get()), counts(data ? p.counts : nullptr) { incref(); }
template<typename U>
WeakPtr(const RefPtr<U> &p): data(p.data), counts(p.counts) { incref(); }
template<typename U>
WeakPtr &assign(const WeakPtr<U> &);
- T *get() const { return (counts && counts->count ? data : 0); }
+ T *get() const { return (counts && counts->count ? data : nullptr); }
void incref() { if(counts) ++counts->weak_count; }
void decref();
};
{
decref();
data = d;
- counts = (d ? new RefCounts : 0);
+ counts = (d ? new RefCounts : nullptr);
incref();
return *this;
}
template<typename U>
RefPtr<T> &RefPtr<T>::assign(const RefPtr<U> &p)
{
+ if(static_cast<const void *>(&p)==this)
+ return *this;
+
decref();
data = p.data;
counts = p.counts;
T *RefPtr<T>::release()
{
T *d = data;
- data = 0;
+ data = nullptr;
decref();
- counts = 0;
+ counts = nullptr;
return d;
}
if(!counts->count)
{
delete data;
- data = 0;
+ data = nullptr;
}
else if(counts->count==RefCounts::KEEP)
- data = 0;
+ data = nullptr;
else
return;
if(!counts->weak_count)
{
delete counts;
- counts = 0;
+ counts = nullptr;
}
}
template<typename U>
WeakPtr<T> &WeakPtr<T>::assign(const WeakPtr<U> &p)
{
+ if(&p==this)
+ return *this;
+
decref();
data = p.get();
- counts = (data ? p.counts : 0);
+ counts = (data ? p.counts : nullptr);
incref();
return *this;
}
if(!counts->weak_count && (!counts->count || counts->count==RefCounts::KEEP))
{
delete counts;
- data = 0;
- counts = 0;
+ data = nullptr;
+ counts = nullptr;
}
}