From be8ea216d23bf36bdfb2d3e302638782575fc136 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 6 Feb 2021 11:55:56 +0200 Subject: [PATCH] Move non-oneliner functions out of RefPtr class declaration --- source/core/refptr.h | 105 ++++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 50 deletions(-) diff --git a/source/core/refptr.h b/source/core/refptr.h index 8ab1b7c..28666ea 100644 --- a/source/core/refptr.h +++ b/source/core/refptr.h @@ -45,14 +45,7 @@ public: ~RefPtr() { decref(); } - RefPtr &operator=(T *d) - { - decref(); - data = d; - counts = (d ? new RefCounts : 0); - incref(); - return *this; - } + RefPtr &operator=(T *); // Likewise for the assignment operator RefPtr &operator=(const RefPtr &p) { return assign(p); } @@ -62,35 +55,17 @@ public: private: template - RefPtr &assign(const RefPtr &p) - { - decref(); - data = p.data; - counts = p.counts; - incref(); - return *this; - } + RefPtr &assign(const RefPtr &); 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; - data = 0; - decref(); - counts = 0; - return d; - } + T *release(); /** Marks the data to not be deleted. This affects all RefPtrs with the same data. */ - void keep() - { - if(counts) - counts->count |= RefCounts::KEEP; - } + void keep() { if(counts) counts->count |= RefCounts::KEEP; } T *get() const { return data; } T &operator*() const { return *data; } @@ -104,31 +79,61 @@ public: { return RefPtr(dynamic_cast(p.data), p.counts); } private: - void incref() + void incref() { if(counts) ++counts->count; } + void decref(); +}; + + +template +RefPtr &RefPtr::operator=(T *d) +{ + decref(); + data = d; + counts = (d ? new RefCounts : 0); + incref(); + return *this; +} + +template +template +RefPtr &RefPtr::assign(const RefPtr &p) +{ + decref(); + data = p.data; + counts = p.counts; + incref(); + return *this; +} + +template +T *RefPtr::release() +{ + T *d = data; + data = 0; + decref(); + counts = 0; + return d; +} + +template +void RefPtr::decref() +{ + if(!counts) return; + --counts->count; + if(!counts->count) { - if(!counts) return; - ++counts->count; + delete data; + delete counts; + data = 0; + counts = 0; } - - void decref() + else if(counts->count==RefCounts::KEEP) { - if(!counts) return; - --counts->count; - if(!counts->count) - { - delete data; - delete counts; - data = 0; - counts = 0; - } - else if(counts->count==RefCounts::KEEP) - { - delete counts; - data = 0; - counts = 0; - } + delete counts; + data = 0; + counts = 0; } -}; +} } // namespace Msp -- 2.45.2