LMMS
Loading...
Searching...
No Matches
juce_ReferenceCountedObject.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 The code included in this file is provided under the terms of the ISC license
11 http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12 To use, copy, modify, and/or distribute this software for any purpose with or
13 without fee is hereby granted provided that the above copyright notice and
14 this permission notice appear in all copies.
15
16 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18 DISCLAIMED.
19
20 ==============================================================================
21*/
22
23namespace juce
24{
25
26//==============================================================================
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 //==============================================================================
108
114 ReferenceCountedObject& operator= (const ReferenceCountedObject&) noexcept { return *this; }
117
120 {
121 // it's dangerous to delete an object that's still referenced by something else!
122 jassert (getReferenceCount() == 0);
123 }
124
129 {
130 refCount = 0;
131 }
132
133private:
134 //==============================================================================
137};
138
139
140//==============================================================================
154{
155public:
156 //==============================================================================
163 {
164 ++refCount;
165 }
166
171 {
173
174 if (--refCount == 0)
175 delete this;
176 }
177
183 {
185 return --refCount == 0;
186 }
187
190
191
192protected:
193 //==============================================================================
196
205
208 {
209 // it's dangerous to delete an object that's still referenced by something else!
210 jassert (getReferenceCount() == 0);
211 }
212
213private:
214 //==============================================================================
215 int refCount = 0;
217};
218
219
220//==============================================================================
245template <class ObjectType>
247{
248public:
250 using ReferencedType = ObjectType;
251
252 //==============================================================================
255
257 ReferenceCountedObjectPtr (decltype (nullptr)) noexcept {}
258
263 : referencedObject (refCountedObject)
264 {
265 incIfNotNull (refCountedObject);
266 }
267
272 : referencedObject (&refCountedObject)
273 {
274 refCountedObject.incReferenceCount();
275 }
276
281 : referencedObject (other.referencedObject)
282 {
284 }
285
288 : referencedObject (other.referencedObject)
289 {
290 other.referencedObject = nullptr;
291 }
292
296 template <typename Convertible>
302
308 {
309 return operator= (other.referencedObject);
310 }
311
316 template <typename Convertible>
318 {
319 return operator= (other.get());
320 }
321
328 {
329 if (newObject != nullptr)
330 return operator= (*newObject);
331
332 reset();
333 return *this;
334 }
335
342 {
343 if (referencedObject != &newObject)
344 {
345 newObject.incReferenceCount();
346 auto* oldObject = referencedObject;
347 referencedObject = &newObject;
348 decIfNotNull (oldObject);
349 }
350
351 return *this;
352 }
353
355 ReferenceCountedObjectPtr& operator= (decltype (nullptr))
356 {
357 reset();
358 return *this;
359 }
360
363 {
364 std::swap (referencedObject, other.referencedObject);
365 return *this;
366 }
367
376
377 //==============================================================================
382
385 {
386 auto oldObject = referencedObject; // need to null the pointer before deleting the object
387 referencedObject = nullptr; // in case this ptr is itself deleted as a side-effect
388 decIfNotNull (oldObject); // of the destructor
389 }
390
391 // the -> operator is called on the referenced object
393 {
394 jassert (referencedObject != nullptr); // null pointer method call!
395 return referencedObject;
396 }
397
402
404 bool operator== (decltype (nullptr)) const noexcept { return referencedObject == nullptr; }
406 bool operator!= (decltype (nullptr)) const noexcept { return referencedObject != nullptr; }
407
409 bool operator== (const ObjectType* other) const noexcept { return referencedObject == other; }
411 bool operator== (const ReferenceCountedObjectPtr& other) const noexcept { return referencedObject == other.get(); }
413 bool operator!= (const ObjectType* other) const noexcept { return referencedObject != other; }
415 bool operator!= (const ReferenceCountedObjectPtr& other) const noexcept { return referencedObject != other.get(); }
416
417 #if JUCE_STRICT_REFCOUNTEDPOINTER
419 explicit operator bool() const noexcept { return referencedObject != nullptr; }
420
421 #else
428 operator ReferencedType*() const noexcept { return referencedObject; }
429 #endif
430
431 #ifndef DOXYGEN
432 [[deprecated ("Use the get method instead.")]]
433 ReferencedType* getObject() const { return get(); }
434 #endif
435
436private:
437 //==============================================================================
439
440 static void incIfNotNull (ReferencedType* o) noexcept
441 {
442 if (o != nullptr)
443 o->incReferenceCount();
444 }
445
446 static void decIfNotNull (ReferencedType* o) noexcept
447 {
448 if (o != nullptr && o->decReferenceCountWithoutDeleting())
450 }
451};
452
453
454//==============================================================================
456template <typename Type>
457bool operator== (const Type* object1, const ReferenceCountedObjectPtr<Type>& object2) noexcept
458{
459 return object1 == object2.get();
460}
461
463template <typename Type>
464bool operator!= (const Type* object1, const ReferenceCountedObjectPtr<Type>& object2) noexcept
465{
466 return object1 != object2.get();
467}
468
469} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_ReferenceCountedObject.h:66
ReferenceCountedObject(const ReferenceCountedObject &) noexcept
Definition juce_ReferenceCountedObject.h:110
Atomic< int > refCount
Definition juce_ReferenceCountedObject.h:135
ReferenceCountedObject(ReferenceCountedObject &&) noexcept
Definition juce_ReferenceCountedObject.h:112
void resetReferenceCount() noexcept
Definition juce_ReferenceCountedObject.h:128
bool decReferenceCountWithoutDeleting() noexcept
Definition juce_ReferenceCountedObject.h:94
void incReferenceCount() noexcept
Definition juce_ReferenceCountedObject.h:74
int getReferenceCount() const noexcept
Definition juce_ReferenceCountedObject.h:101
void decReferenceCount() noexcept
Definition juce_ReferenceCountedObject.h:82
virtual ~ReferenceCountedObject()
Definition juce_ReferenceCountedObject.h:119
Definition juce_ReferenceCountedObject.h:247
~ReferenceCountedObjectPtr()
Definition juce_ReferenceCountedObject.h:372
SynthesiserSound ReferencedType
Definition juce_ReferenceCountedObject.h:250
static void incIfNotNull(ReferencedType *o) noexcept
Definition juce_ReferenceCountedObject.h:440
ReferenceCountedObjectPtr(ReferenceCountedObjectPtr &&other) noexcept
Definition juce_ReferenceCountedObject.h:287
ReferenceCountedObjectPtr(ReferencedType *refCountedObject) noexcept
Definition juce_ReferenceCountedObject.h:262
static void decIfNotNull(ReferencedType *o) noexcept
Definition juce_ReferenceCountedObject.h:446
ReferenceCountedObjectPtr(ReferencedType &refCountedObject) noexcept
Definition juce_ReferenceCountedObject.h:271
ReferenceCountedObjectPtr(const ReferenceCountedObjectPtr< Convertible > &other) noexcept
Definition juce_ReferenceCountedObject.h:297
ReferencedType * referencedObject
Definition juce_ReferenceCountedObject.h:438
void reset() noexcept
Definition juce_ReferenceCountedObject.h:384
ReferenceCountedObjectPtr(decltype(nullptr)) noexcept
Definition juce_ReferenceCountedObject.h:257
ReferencedType & operator*() const noexcept
Definition juce_ReferenceCountedObject.h:401
ReferencedType * operator->() const noexcept
Definition juce_ReferenceCountedObject.h:392
ReferenceCountedObjectPtr(const ReferenceCountedObjectPtr &other) noexcept
Definition juce_ReferenceCountedObject.h:280
ReferencedType * get() const noexcept
Definition juce_ReferenceCountedObject.h:381
ReferencedType * getObject() const
Definition juce_ReferenceCountedObject.h:433
int refCount
Definition juce_ReferenceCountedObject.h:215
virtual ~SingleThreadedReferenceCountedObject()
Definition juce_ReferenceCountedObject.h:207
SingleThreadedReferenceCountedObject(SingleThreadedReferenceCountedObject &&)
Definition juce_ReferenceCountedObject.h:200
SingleThreadedReferenceCountedObject(const SingleThreadedReferenceCountedObject &)
Definition juce_ReferenceCountedObject.h:198
void decReferenceCount() noexcept
Definition juce_ReferenceCountedObject.h:170
void incReferenceCount() noexcept
Definition juce_ReferenceCountedObject.h:162
int getReferenceCount() const noexcept
Definition juce_ReferenceCountedObject.h:189
bool decReferenceCountWithoutDeleting() noexcept
Definition juce_ReferenceCountedObject.h:182
#define jassert(expression)
#define JUCE_API
Definition juce_StandardHeader.h:152
Definition carla_juce.cpp:31
Definition juce_Atomic.h:42
Definition juce_ContainerDeletePolicy.h:41
static void destroy(ObjectType *object)
Definition juce_ContainerDeletePolicy.h:42
#define const
Definition zconf.h:137