32template <
class ObjectType>
37 JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE (
"-Wdeprecated-declarations")
38 JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996)
44 inline ScopedPointer (ObjectType* objectToTakePossessionOf) noexcept
45 : object (objectToTakePossessionOf)
50 : object (objectToTransferFrom.release())
58 if (
this != objectToTransferFrom.getAddress())
62 jassert (
object ==
nullptr ||
object != objectToTransferFrom.object);
63 reset (objectToTransferFrom.release());
69 ScopedPointer& operator= (ObjectType* newObjectToTakePossessionOf)
71 reset (newObjectToTakePossessionOf);
77 other.object =
nullptr;
82 reset (other.release());
87 inline operator ObjectType*()
const noexcept {
return object; }
88 inline ObjectType* get()
const noexcept {
return object; }
89 inline ObjectType& operator*()
const noexcept {
return *object; }
90 inline ObjectType* operator->()
const noexcept {
return object; }
94 auto* oldObject = object;
99 void reset (ObjectType* newObject)
101 if (
object != newObject)
103 auto* oldObject = object;
111 jassert (newObject ==
nullptr);
117 reset (newObject.release());
120 ObjectType* release()
noexcept {
auto* o = object;
object = {};
return o; }
127 jassert (
object != other.object ||
this == other.getAddress() ||
object ==
nullptr);
129 std::swap (
object, other.object);
132 inline ObjectType* createCopy()
const {
return createCopyIfNotNull (
object); }
136 ObjectType*
object =
nullptr;
138 const ScopedPointer* getAddress()
const noexcept {
return this; }
145 JUCE_END_IGNORE_WARNINGS_MSVC
146 JUCE_END_IGNORE_WARNINGS_GCC_LIKE
150JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE (
"-Wdeprecated-declarations")
151JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996)
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"); }
219JUCE_END_IGNORE_WARNINGS_GCC_LIKE
220JUCE_END_IGNORE_WARNINGS_MSVC