83 jassert (getReferenceCount() > 0);
95 jassert (getReferenceCount() > 0);
96 return --refCount == 0;
121 jassert (getReferenceCount() == 0);
135 friend struct ContainerDeletePolicy<ReferenceCountedObject>;
171 jassert (getReferenceCount() > 0);
183 jassert (getReferenceCount() > 0);
184 return --refCount == 0;
209 jassert (getReferenceCount() == 0);
244template <
class ObjectType>
262 : referencedObject (refCountedObject)
264 incIfNotNull (refCountedObject);
271 : referencedObject (&refCountedObject)
273 refCountedObject.incReferenceCount();
280 : referencedObject (other.referencedObject)
282 incIfNotNull (referencedObject);
287 : referencedObject (other.referencedObject)
289 other.referencedObject =
nullptr;
295 template <
typename Convertible>
297 : referencedObject (other.get())
299 incIfNotNull (referencedObject);
308 return operator= (other.referencedObject);
315 template <
typename Convertible>
328 if (newObject !=
nullptr)
342 if (referencedObject != &newObject)
344 newObject.incReferenceCount();
345 auto* oldObject = referencedObject;
346 referencedObject = &newObject;
347 decIfNotNull (oldObject);
363 std::swap (referencedObject, other.referencedObject);
373 decIfNotNull (referencedObject);
385 auto oldObject = referencedObject;
386 referencedObject =
nullptr;
387 decIfNotNull (oldObject);
393 jassert (referencedObject !=
nullptr);
394 return referencedObject;
403 bool operator== (
decltype (
nullptr)) const noexcept {
return referencedObject ==
nullptr; }
405 bool operator!= (
decltype (
nullptr)) const noexcept {
return referencedObject !=
nullptr; }
408 bool operator== (
const ObjectType* other)
const noexcept {
return referencedObject == other; }
412 bool operator!= (
const ObjectType* other)
const noexcept {
return referencedObject != other; }
416 #if JUCE_STRICT_REFCOUNTEDPOINTER
418 explicit operator bool() const noexcept {
return referencedObject !=
nullptr; }
441 o->incReferenceCount();
446 if (o !=
nullptr && o->decReferenceCountWithoutDeleting())
447 ContainerDeletePolicy<ReferencedType>::destroy (o);
454template <
typename Type>
455bool operator== (
const Type* object1,
const ReferenceCountedObjectPtr<Type>& object2)
noexcept
457 return object1 == object2.get();
461template <
typename Type>
462bool operator!= (
const Type* object1,
const ReferenceCountedObjectPtr<Type>& object2)
noexcept
464 return object1 != object2.get();
A smart-pointer class which points to a reference-counted object.
~ReferenceCountedObjectPtr()
Destructor.
ReferenceCountedObjectPtr & operator=(const ReferenceCountedObjectPtr &other)
Changes this pointer to point at a different object.
ObjectType ReferencedType
The class being referenced by this pointer.
bool operator!=(decltype(nullptr)) const noexcept
Checks whether this pointer is null.
ReferenceCountedObjectPtr(ReferenceCountedObjectPtr &&other) noexcept
Takes-over the object from another pointer.
bool operator==(decltype(nullptr)) const noexcept
Checks whether this pointer is null.
ReferenceCountedObjectPtr(ReferencedType *refCountedObject) noexcept
Creates a pointer to an object.
ReferenceCountedObjectPtr(ReferencedType &refCountedObject) noexcept
Creates a pointer to an object.
ReferenceCountedObjectPtr()=default
Creates a pointer to a null object.
ReferenceCountedObjectPtr(const ReferenceCountedObjectPtr< Convertible > &other) noexcept
Copies another pointer.
void reset() noexcept
Resets this object to a null pointer.
ReferenceCountedObjectPtr(decltype(nullptr)) noexcept
Creates a pointer to a null object.
ReferencedType & operator*() const noexcept
Dereferences the object that this pointer references.
ReferenceCountedObjectPtr(const ReferenceCountedObjectPtr &other) noexcept
Copies another pointer.
ReferencedType * get() const noexcept
Returns the object that this pointer references.
A base class which provides methods for reference-counting.
ReferenceCountedObject(const ReferenceCountedObject &) noexcept
Copying from another object does not affect this one's reference-count.
ReferenceCountedObject(ReferenceCountedObject &&) noexcept
Copying from another object does not affect this one's reference-count.
void resetReferenceCount() noexcept
Resets the reference count to zero without deleting the object.
bool decReferenceCountWithoutDeleting() noexcept
Decreases the object's reference count.
ReferenceCountedObject()=default
Creates the reference-counted object (with an initial ref count of zero).
void incReferenceCount() noexcept
Increments the object's reference count.
int getReferenceCount() const noexcept
Returns the object's current reference count.
void decReferenceCount() noexcept
Decreases the object's reference count.
virtual ~ReferenceCountedObject()
Destructor.
Adds reference-counting to an object.
virtual ~SingleThreadedReferenceCountedObject()
Destructor.
SingleThreadedReferenceCountedObject(SingleThreadedReferenceCountedObject &&)
Copying from another object does not affect this one's reference-count.
SingleThreadedReferenceCountedObject(const SingleThreadedReferenceCountedObject &)
Copying from another object does not affect this one's reference-count.
SingleThreadedReferenceCountedObject()=default
Creates the reference-counted object (with an initial ref count of zero).
void decReferenceCount() noexcept
Decreases the object's reference count.
void incReferenceCount() noexcept
Increments the object's reference count.
int getReferenceCount() const noexcept
Returns the object's current reference count.
bool decReferenceCountWithoutDeleting() noexcept
Decreases the object's reference count.
#define JUCE_API
This macro is added to all JUCE public class declarations.
A simple wrapper around std::atomic.
Used by container classes as an indirect way to delete an object of a particular type.