32 template <
class ObjectType>
41 JUCE_DEPRECATED_ATTRIBUTE
inline ScopedPointer (decltype (
nullptr)) noexcept {}
44 JUCE_DEPRECATED_ATTRIBUTE
inline ScopedPointer (ObjectType* objectToTakePossessionOf) noexcept
45 : object (objectToTakePossessionOf)
51 : object (objectToTransferFrom.release())
56 JUCE_DEPRECATED_ATTRIBUTE
inline ~
ScopedPointer() { reset(); }
60 if (
this != objectToTransferFrom.getAddress())
64 jassert (
object ==
nullptr ||
object != objectToTransferFrom.object);
65 reset (objectToTransferFrom.release());
71 ScopedPointer& operator= (ObjectType* newObjectToTakePossessionOf)
73 reset (newObjectToTakePossessionOf);
79 other.object =
nullptr;
84 reset (other.release());
89 inline operator ObjectType*()
const noexcept {
return object; }
90 inline ObjectType* get()
const noexcept {
return object; }
91 inline ObjectType& operator*()
const noexcept {
return *object; }
92 inline ObjectType* operator->()
const noexcept {
return object; }
96 auto* oldObject = object;
101 void reset (ObjectType* newObject)
103 if (
object != newObject)
105 auto* oldObject = object;
113 jassert (newObject ==
nullptr);
119 reset (newObject.release());
122 ObjectType* release() noexcept {
auto* o = object;
object = {};
return o; }
129 jassert (
object != other.object ||
this == other.getAddress() ||
object ==
nullptr);
131 std::swap (
object, other.object);
134 inline ObjectType* createCopy()
const {
return createCopyIfNotNull (
object); }
138 ObjectType*
object =
nullptr;
140 const ScopedPointer* getAddress()
const noexcept {
return this; }
149 template <
typename ObjectType1,
typename ObjectType2>
152 return pointer1 == pointer2.get();
155 template <
typename ObjectType1,
typename ObjectType2>
156 bool operator!= (ObjectType1* pointer1,
const ScopedPointer<ObjectType2>& pointer2) noexcept
158 return pointer1 != pointer2.get();
161 template <
typename ObjectType1,
typename ObjectType2>
162 bool operator== (
const ScopedPointer<ObjectType1>& pointer1, ObjectType2* pointer2) noexcept
164 return pointer1.get() == pointer2;
167 template <
typename ObjectType1,
typename ObjectType2>
168 bool operator!= (
const ScopedPointer<ObjectType1>& pointer1, ObjectType2* pointer2) noexcept
170 return pointer1.get() != pointer2;
173 template <
typename ObjectType1,
typename ObjectType2>
174 bool operator== (
const ScopedPointer<ObjectType1>& pointer1,
const ScopedPointer<ObjectType2>& pointer2) noexcept
176 return pointer1.get() == pointer2.get();
179 template <
typename ObjectType1,
typename ObjectType2>
180 bool operator!= (
const ScopedPointer<ObjectType1>& pointer1,
const ScopedPointer<ObjectType2>& pointer2) noexcept
182 return pointer1.get() != pointer2.get();
185 template <
class ObjectType>
186 bool operator== (decltype (
nullptr),
const ScopedPointer<ObjectType>& pointer) noexcept
188 return pointer.get() ==
nullptr;
191 template <
class ObjectType>
192 bool operator!= (decltype (
nullptr),
const ScopedPointer<ObjectType>& pointer) noexcept
194 return pointer.get() !=
nullptr;
197 template <
class ObjectType>
198 bool operator== (
const ScopedPointer<ObjectType>& pointer, decltype (
nullptr)) noexcept
200 return pointer.get() ==
nullptr;
203 template <
class ObjectType>
204 bool operator!= (
const ScopedPointer<ObjectType>& pointer, decltype (
nullptr)) noexcept
206 return pointer.get() !=
nullptr;
211 template <
typename Type>
212 void deleteAndZero (ScopedPointer<Type>&) { static_assert (
sizeof (Type) == 12345,
213 "Attempt to call deleteAndZero() on a ScopedPointer"); }