32template <
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())
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; }
149template <
typename ObjectType1,
typename ObjectType2>
152 return pointer1 == pointer2.get();
155template <
typename ObjectType1,
typename ObjectType2>
156bool operator!= (ObjectType1* pointer1,
const ScopedPointer<ObjectType2>& pointer2)
noexcept
158 return pointer1 != pointer2.get();
161template <
typename ObjectType1,
typename ObjectType2>
162bool operator== (
const ScopedPointer<ObjectType1>& pointer1, ObjectType2* pointer2)
noexcept
164 return pointer1.get() == pointer2;
167template <
typename ObjectType1,
typename ObjectType2>
168bool operator!= (
const ScopedPointer<ObjectType1>& pointer1, ObjectType2* pointer2)
noexcept
170 return pointer1.get() != pointer2;
173template <
typename ObjectType1,
typename ObjectType2>
174bool operator== (
const ScopedPointer<ObjectType1>& pointer1,
const ScopedPointer<ObjectType2>& pointer2)
noexcept
176 return pointer1.get() == pointer2.get();
179template <
typename ObjectType1,
typename ObjectType2>
180bool operator!= (
const ScopedPointer<ObjectType1>& pointer1,
const ScopedPointer<ObjectType2>& pointer2)
noexcept
182 return pointer1.get() != pointer2.get();
185template <
class ObjectType>
186bool operator== (
decltype (
nullptr),
const ScopedPointer<ObjectType>& pointer)
noexcept
188 return pointer.get() ==
nullptr;
191template <
class ObjectType>
192bool operator!= (
decltype (
nullptr),
const ScopedPointer<ObjectType>& pointer)
noexcept
194 return pointer.get() !=
nullptr;
197template <
class ObjectType>
198bool operator== (
const ScopedPointer<ObjectType>& pointer,
decltype (
nullptr)) noexcept
200 return pointer.get() ==
nullptr;
203template <
class ObjectType>
204bool operator!= (
const ScopedPointer<ObjectType>& pointer,
decltype (
nullptr)) noexcept
206 return pointer.get() !=
nullptr;
211template <
typename Type>
212void deleteAndZero (ScopedPointer<Type>&) {
static_assert (
sizeof (Type) == 12345,
213 "Attempt to call deleteAndZero() on a ScopedPointer"); }