LMMS
Loading...
Searching...
No Matches
ReferenceCountedObject.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the Water library.
5 Copyright (c) 2016 ROLI Ltd.
6 Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com>
7
8 Permission is granted to use this software under the terms of the ISC license
9 http://www.isc.org/downloads/software-support-policy/isc-license/
10
11 Permission to use, copy, modify, and/or distribute this software for any
12 purpose with or without fee is hereby granted, provided that the above
13 copyright notice and this permission notice appear in all copies.
14
15 THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
16 TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
18 OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
19 USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
21 OF THIS SOFTWARE.
22
23 ==============================================================================
24*/
25
26#ifndef WATER_REFERENCECOUNTEDOBJECT_H_INCLUDED
27#define WATER_REFERENCECOUNTEDOBJECT_H_INCLUDED
28
29#include "Atomic.h"
30
31namespace water {
32
33//==============================================================================
66{
67public:
68 //==============================================================================
75 {
76 ++refCount;
77 }
78
83 {
85
86 if (--refCount == 0)
87 delete this;
88 }
89
95 {
97 return --refCount == 0;
98 }
99
101 int getReferenceCount() const noexcept { return refCount.get(); }
102
103
104protected:
105 //==============================================================================
109
112 {
113 // it's dangerous to delete an object that's still referenced by something else!
114 wassert (getReferenceCount() == 0);
115 }
116
121 {
122 refCount = 0;
123 }
124
125private:
126 //==============================================================================
128
130};
131
132
133//==============================================================================
145{
146public:
147 //==============================================================================
154 {
155 ++refCount;
156 }
157
162 {
164
165 if (--refCount == 0)
166 delete this;
167 }
168
174 {
176 return --refCount == 0;
177 }
178
181
182
183protected:
184 //==============================================================================
187
190 {
191 // it's dangerous to delete an object that's still referenced by something else!
192 wassert (getReferenceCount() == 0);
193 }
194
195private:
196 //==============================================================================
198
200};
201
202
203//==============================================================================
225template <class ReferenceCountedObjectClass>
227{
228public:
230 typedef ReferenceCountedObjectClass ReferencedType;
231
232 //==============================================================================
238
243 : referencedObject (refCountedObject)
244 {
245 incIfNotNull (refCountedObject);
246 }
247
252 : referencedObject (other.referencedObject)
253 {
255 }
256
260 template <typename Convertible>
266
275
280 template <typename Convertible>
282 {
283 return operator= (static_cast<ReferencedType*> (other.get()));
284 }
285
292 {
293 if (referencedObject != newObject)
294 {
295 incIfNotNull (newObject);
296 ReferencedType* const oldObject = referencedObject;
297 referencedObject = newObject;
298 decIfNotNull (oldObject);
299 }
300
301 return *this;
302 }
303
309 {
310 ReferencedType* const oldObject = referencedObject; // need to null the pointer before deleting the object
311 referencedObject = nullptr; // in case this ptr is itself deleted as a side-effect
312 decIfNotNull (oldObject); // of the destructor
313 }
314
315 //==============================================================================
319 operator ReferencedType*() const noexcept { return referencedObject; }
320
325
330
331 // the -> operator is called on the referenced object
333 {
334 wassert (referencedObject != nullptr); // null pointer method call!
335 return referencedObject;
336 }
337
338private:
339 //==============================================================================
341
342 static void incIfNotNull (ReferencedType* o) noexcept
343 {
344 if (o != nullptr)
345 o->incReferenceCount();
346 }
347
348 static void decIfNotNull (ReferencedType* o) noexcept
349 {
350 if (o != nullptr && o->decReferenceCountWithoutDeleting())
351 delete o;
352 }
353};
354
355
356//==============================================================================
358template <typename ReferenceCountedObjectClass>
359bool operator== (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object1, ReferenceCountedObjectClass* const object2) noexcept
360{
361 return object1.get() == object2;
362}
363
365template <typename ReferenceCountedObjectClass>
367{
368 return object1.get() == object2.get();
369}
370
372template <typename ReferenceCountedObjectClass>
373bool operator== (ReferenceCountedObjectClass* object1, const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept
374{
375 return object1 == object2.get();
376}
377
379template <typename ReferenceCountedObjectClass>
380bool operator!= (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object1, const ReferenceCountedObjectClass* object2) noexcept
381{
382 return object1.get() != object2;
383}
384
386template <typename ReferenceCountedObjectClass>
388{
389 return object1.get() != object2.get();
390}
391
393template <typename ReferenceCountedObjectClass>
394bool operator!= (ReferenceCountedObjectClass* object1, const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept
395{
396 return object1 != object2.get();
397}
398
399}
400
401#endif // WATER_REFERENCECOUNTEDOBJECT_H_INCLUDED
#define CARLA_DECLARE_NON_COPYABLE(ClassName)
Definition CarlaDefines.h:242
#define noexcept
Definition DistrhoDefines.h:72
Definition Atomic.h:95
virtual ~ReferenceCountedObject()
Definition ReferenceCountedObject.h:111
int getReferenceCount() const noexcept
Definition ReferenceCountedObject.h:101
void incReferenceCount() noexcept
Definition ReferenceCountedObject.h:74
void decReferenceCount() noexcept
Definition ReferenceCountedObject.h:82
bool decReferenceCountWithoutDeleting() noexcept
Definition ReferenceCountedObject.h:94
ReferenceCountedObject()
Definition ReferenceCountedObject.h:107
void resetReferenceCount() noexcept
Definition ReferenceCountedObject.h:120
Atomic< int > refCount
Definition ReferenceCountedObject.h:127
Definition ReferenceCountedObject.h:227
ReferenceCountedObjectPtr() noexcept
Definition ReferenceCountedObject.h:234
Sound ReferencedType
Definition ReferenceCountedObject.h:230
ReferencedType * getObject() const noexcept
Definition ReferenceCountedObject.h:329
ReferencedType * get() const noexcept
Definition ReferenceCountedObject.h:324
ReferenceCountedObjectPtr(const ReferenceCountedObjectPtr< Convertible > &other) noexcept
Definition ReferenceCountedObject.h:261
~ReferenceCountedObjectPtr()
Definition ReferenceCountedObject.h:308
ReferenceCountedObjectPtr & operator=(const ReferenceCountedObjectPtr &other)
Definition ReferenceCountedObject.h:271
ReferenceCountedObjectPtr(ReferencedType *refCountedObject) noexcept
Definition ReferenceCountedObject.h:242
static void incIfNotNull(ReferencedType *o) noexcept
Definition ReferenceCountedObject.h:342
ReferencedType * operator->() const noexcept
Definition ReferenceCountedObject.h:332
ReferencedType * referencedObject
Definition ReferenceCountedObject.h:340
ReferenceCountedObjectPtr(const ReferenceCountedObjectPtr &other) noexcept
Definition ReferenceCountedObject.h:251
static void decIfNotNull(ReferencedType *o) noexcept
Definition ReferenceCountedObject.h:348
virtual ~SingleThreadedReferenceCountedObject()
Definition ReferenceCountedObject.h:189
int refCount
Definition ReferenceCountedObject.h:197
void decReferenceCount() noexcept
Definition ReferenceCountedObject.h:161
void incReferenceCount() noexcept
Definition ReferenceCountedObject.h:153
SingleThreadedReferenceCountedObject()
Definition ReferenceCountedObject.h:186
bool decReferenceCountWithoutDeleting() noexcept
Definition ReferenceCountedObject.h:173
int getReferenceCount() const noexcept
Definition ReferenceCountedObject.h:180
#define wassert(expression)
Definition AudioSampleBuffer.h:33
bool operator==(const ReferenceCountedObjectPtr< ReferenceCountedObjectClass > &object1, ReferenceCountedObjectClass *const object2) noexcept
Definition ReferenceCountedObject.h:359
bool operator!=(const ReferenceCountedObjectPtr< ReferenceCountedObjectClass > &object1, const ReferenceCountedObjectClass *object2) noexcept
Definition ReferenceCountedObject.h:380
#define const
Definition zconf.h:137