36template <
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;
153template <
typename ObjectType1,
typename ObjectType2>
154bool operator== (ObjectType1* pointer1,
const ScopedPointer<ObjectType2>& pointer2)
noexcept
156 return pointer1 == pointer2.get();
159template <
typename ObjectType1,
typename ObjectType2>
160bool operator!= (ObjectType1* pointer1,
const ScopedPointer<ObjectType2>& pointer2)
noexcept
162 return pointer1 != pointer2.get();
165template <
typename ObjectType1,
typename ObjectType2>
166bool operator== (
const ScopedPointer<ObjectType1>& pointer1, ObjectType2* pointer2)
noexcept
168 return pointer1.get() == pointer2;
171template <
typename ObjectType1,
typename ObjectType2>
172bool operator!= (
const ScopedPointer<ObjectType1>& pointer1, ObjectType2* pointer2)
noexcept
174 return pointer1.get() != pointer2;
177template <
typename ObjectType1,
typename ObjectType2>
178bool operator== (
const ScopedPointer<ObjectType1>& pointer1,
const ScopedPointer<ObjectType2>& pointer2)
noexcept
180 return pointer1.get() == pointer2.get();
183template <
typename ObjectType1,
typename ObjectType2>
184bool operator!= (
const ScopedPointer<ObjectType1>& pointer1,
const ScopedPointer<ObjectType2>& pointer2)
noexcept
186 return pointer1.get() != pointer2.get();
189template <
class ObjectType>
190bool operator== (
decltype (
nullptr),
const ScopedPointer<ObjectType>& pointer)
noexcept
192 return pointer.get() ==
nullptr;
195template <
class ObjectType>
196bool operator!= (
decltype (
nullptr),
const ScopedPointer<ObjectType>& pointer)
noexcept
198 return pointer.get() !=
nullptr;
201template <
class ObjectType>
202bool operator== (
const ScopedPointer<ObjectType>& pointer,
decltype (
nullptr)) noexcept
204 return pointer.get() ==
nullptr;
207template <
class ObjectType>
208bool operator!= (
const ScopedPointer<ObjectType>& pointer,
decltype (
nullptr)) noexcept
210 return pointer.get() !=
nullptr;
215template <
typename Type>
216void deleteAndZero (ScopedPointer<Type>&) {
static_assert (
sizeof (Type) == 12345,
217 "Attempt to call deleteAndZero() on a ScopedPointer"); }