OpenShot Audio Library | OpenShotAudio 0.4.0

Loading...
Searching...
No Matches
juce_WeakReference.h
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
23 namespace juce
24{
25
26//==============================================================================
76 template <class ObjectType, class ReferenceCountingType = ReferenceCountedObject>
77 class WeakReference
78{
79 public:
81 inline WeakReference() = default;
82
84 WeakReference (ObjectType* object) : holder (getRef (object)) {}
85
87 WeakReference (const WeakReference& other) noexcept : holder (other.holder) {}
88
90 WeakReference (WeakReference&& other) noexcept : holder (std::move (other.holder)) {}
91
93 WeakReference& operator= (const WeakReference& other) { holder = other.holder; return *this; }
94
96 WeakReference& operator= (ObjectType* newObject) { holder = getRef (newObject); return *this; }
97
99 WeakReference& operator= (WeakReference&& other) noexcept { holder = std::move (other.holder); return *this; }
100
102 ObjectType* get() const noexcept { return holder != nullptr ? holder->get() : nullptr; }
103
105 operator ObjectType*() const noexcept { return get(); }
106
108 ObjectType* operator->() const noexcept { return get(); }
109
117 bool wasObjectDeleted() const noexcept { return holder != nullptr && holder->get() == nullptr; }
118
119 //==============================================================================
124 class SharedPointer : public ReferenceCountingType
125 {
126 public:
127 explicit SharedPointer (ObjectType* obj) noexcept : owner (obj) {}
128
129 inline ObjectType* get() const noexcept { return owner; }
130 void clearPointer() noexcept { owner = nullptr; }
131
132 private:
133 ObjectType* owner;
134
135 JUCE_DECLARE_NON_COPYABLE (SharedPointer)
136 };
137
138 using SharedRef = ReferenceCountedObjectPtr<SharedPointer>;
139
140 //==============================================================================
146 class Master
147 {
148 public:
149 Master() = default;
150
151 ~Master() noexcept
152 {
153 // You must remember to call clear() in your source object's destructor! See the notes
154 // for the WeakReference class for an example of how to do this.
155 jassert (sharedPointer == nullptr || sharedPointer->get() == nullptr);
156 }
157
161 SharedRef getSharedPointer (ObjectType* object)
162 {
163 if (sharedPointer == nullptr)
164 {
165 sharedPointer = *new SharedPointer (object);
166 }
167 else
168 {
169 // You're trying to create a weak reference to an object that has already been deleted!!
170 jassert (sharedPointer->get() != nullptr);
171 }
172
173 return sharedPointer;
174 }
175
180 void clear() noexcept
181 {
182 if (sharedPointer != nullptr)
183 sharedPointer->clearPointer();
184 }
185
187 int getNumActiveWeakReferences() const noexcept
188 {
189 return sharedPointer == nullptr ? 0 : (sharedPointer->getReferenceCount() - 1);
190 }
191
192 private:
193 SharedRef sharedPointer;
194
195 JUCE_DECLARE_NON_COPYABLE (Master)
196 };
197
198 private:
199 SharedRef holder;
200
201 static SharedRef getRef (ObjectType* o)
202 {
203 if (o != nullptr)
204 return o->masterReference.getSharedPointer (o);
205
206 return {};
207 }
208};
209
210
211//==============================================================================
231#define JUCE_DECLARE_WEAK_REFERENCEABLE(Class) \
232 struct WeakRefMaster : public juce::WeakReference<Class>::Master { ~WeakRefMaster() { this->clear(); } }; \
233 WeakRefMaster masterReference; \
234 friend class juce::WeakReference<Class>; \
235
236
237} // namespace juce
juce::ReferenceCountedObjectPtr< SharedPointer >
juce::ReferenceCountedObjectPtr::get
ReferencedType * get() const noexcept
Definition juce_ReferenceCountedObject.h:381
juce::WeakReference::Master
Definition juce_WeakReference.h:147
juce::WeakReference::Master::getNumActiveWeakReferences
int getNumActiveWeakReferences() const noexcept
Definition juce_WeakReference.h:187
juce::WeakReference::Master::clear
void clear() noexcept
Definition juce_WeakReference.h:180
juce::WeakReference::Master::getSharedPointer
SharedRef getSharedPointer(ObjectType *object)
Definition juce_WeakReference.h:161
juce::WeakReference::SharedPointer
Definition juce_WeakReference.h:125
juce::WeakReference
Definition juce_WeakReference.h:78
juce::WeakReference::operator->
ObjectType * operator->() const noexcept
Definition juce_WeakReference.h:108
juce::WeakReference::WeakReference
WeakReference()=default
juce::WeakReference::get
ObjectType * get() const noexcept
Definition juce_WeakReference.h:102
juce::WeakReference::WeakReference
WeakReference(WeakReference &&other) noexcept
Definition juce_WeakReference.h:90
juce::WeakReference::operator=
WeakReference & operator=(const WeakReference &other)
Definition juce_WeakReference.h:93
juce::WeakReference::WeakReference
WeakReference(const WeakReference &other) noexcept
Definition juce_WeakReference.h:87
juce::WeakReference::wasObjectDeleted
bool wasObjectDeleted() const noexcept
Definition juce_WeakReference.h:117
juce::WeakReference::WeakReference
WeakReference(ObjectType *object)
Definition juce_WeakReference.h:84