36 template <
class ObjectType>
42 JUCE_DEPRECATED_ATTRIBUTE
inline ScopedPointer() =
default;
45 JUCE_DEPRECATED_ATTRIBUTE
inline ScopedPointer (decltype (
nullptr)) noexcept {}
48 JUCE_DEPRECATED_ATTRIBUTE
inline ScopedPointer (ObjectType* objectToTakePossessionOf) noexcept
49 : object (objectToTakePossessionOf)
54 ScopedPointer (ScopedPointer& objectToTransferFrom) noexcept
55 : object (objectToTransferFrom.release())
60 JUCE_DEPRECATED_ATTRIBUTE
inline ~ScopedPointer() { reset(); }
62 ScopedPointer& operator= (ScopedPointer& objectToTransferFrom)
64 if (
this != objectToTransferFrom.getAddress())
68 jassert (
object ==
nullptr ||
object != objectToTransferFrom.object);
69 reset (objectToTransferFrom.release());
75 ScopedPointer& operator= (ObjectType* newObjectToTakePossessionOf)
77 reset (newObjectToTakePossessionOf);
81 ScopedPointer (ScopedPointer&& other) noexcept : object (other.object)
83 other.object =
nullptr;
86 ScopedPointer& operator= (ScopedPointer&& other) noexcept
88 reset (other.release());
93 inline operator ObjectType*()
const noexcept {
return object; }
94 inline ObjectType* get() const noexcept {
return object; }
95 inline ObjectType& operator*() const noexcept {
return *object; }
96 inline ObjectType* operator->() const noexcept {
return object; }
100 auto* oldObject = object;
102 ContainerDeletePolicy<ObjectType>::destroy (oldObject);
105 void reset (ObjectType* newObject)
107 if (
object != newObject)
109 auto* oldObject = object;
111 ContainerDeletePolicy<ObjectType>::destroy (oldObject);
117 jassert (newObject ==
nullptr);
121 void reset (ScopedPointer& newObject)
123 reset (newObject.release());
126 ObjectType* release() noexcept {
auto* o = object;
object = {};
return o; }
129 void swapWith (ScopedPointer<ObjectType>& other) noexcept
133 jassert (
object != other.object ||
this == other.getAddress() ||
object ==
nullptr);
135 std::swap (
object, other.object);
138 inline ObjectType* createCopy()
const {
return createCopyIfNotNull (
object); }
142 ObjectType*
object =
nullptr;
144 const ScopedPointer* getAddress() const noexcept {
return this; }
147 ScopedPointer (
const ScopedPointer&) =
delete;
148 ScopedPointer& operator= (
const ScopedPointer&) =
delete;
153 template <
typename ObjectType1,
typename ObjectType2>
154 bool operator== (ObjectType1* pointer1,
const ScopedPointer<ObjectType2>& pointer2) noexcept
156 return pointer1 == pointer2.get();
159 template <
typename ObjectType1,
typename ObjectType2>
160 bool operator!= (ObjectType1* pointer1,
const ScopedPointer<ObjectType2>& pointer2) noexcept
162 return pointer1 != pointer2.get();
165 template <
typename ObjectType1,
typename ObjectType2>
166 bool operator== (
const ScopedPointer<ObjectType1>& pointer1, ObjectType2* pointer2) noexcept
168 return pointer1.get() == pointer2;
171 template <
typename ObjectType1,
typename ObjectType2>
172 bool operator!= (
const ScopedPointer<ObjectType1>& pointer1, ObjectType2* pointer2) noexcept
174 return pointer1.get() != pointer2;
177 template <
typename ObjectType1,
typename ObjectType2>
178 bool operator== (
const ScopedPointer<ObjectType1>& pointer1,
const ScopedPointer<ObjectType2>& pointer2) noexcept
180 return pointer1.get() == pointer2.get();
183 template <
typename ObjectType1,
typename ObjectType2>
184 bool operator!= (
const ScopedPointer<ObjectType1>& pointer1,
const ScopedPointer<ObjectType2>& pointer2) noexcept
186 return pointer1.get() != pointer2.get();
189 template <
class ObjectType>
190 bool operator== (decltype (
nullptr),
const ScopedPointer<ObjectType>& pointer) noexcept
192 return pointer.get() ==
nullptr;
195 template <
class ObjectType>
196 bool operator!= (decltype (
nullptr),
const ScopedPointer<ObjectType>& pointer) noexcept
198 return pointer.get() !=
nullptr;
201 template <
class ObjectType>
202 bool operator== (
const ScopedPointer<ObjectType>& pointer, decltype (
nullptr)) noexcept
204 return pointer.get() ==
nullptr;
207 template <
class ObjectType>
208 bool operator!= (
const ScopedPointer<ObjectType>& pointer, decltype (
nullptr)) noexcept
210 return pointer.get() !=
nullptr;
215 template <
typename Type>
216 void deleteAndZero (ScopedPointer<Type>&) { static_assert (
sizeof (Type) == 12345,
217 "Attempt to call deleteAndZero() on a ScopedPointer"); }