61 template <
class ObjectType>
74 : object (objectToTakePossessionOf)
85 : object (objectToTransferFrom.release())
105 if (
this != objectToTransferFrom.getAddress())
109 jassert (
object ==
nullptr ||
object != objectToTransferFrom.object);
122 reset (newObjectToTakePossessionOf);
129 other.object =
nullptr;
135 reset (other.release());
141 inline operator ObjectType*()
const noexcept {
return object; }
144 inline ObjectType*
get() const noexcept {
return object; }
147 inline ObjectType&
operator*() const noexcept {
return *object; }
150 inline ObjectType*
operator->() const noexcept {
return object; }
156 auto* oldObject = object;
164 if (
object != newObject)
166 auto* oldObject = object;
174 jassert (newObject ==
nullptr);
187 ObjectType*
release() noexcept {
auto* o = object;
object = {};
return o; }
197 jassert (
object != other.object ||
this == other.getAddress() ||
object ==
nullptr);
199 std::swap (
object, other.object);
205 inline ObjectType*
createCopy()
const {
return createCopyIfNotNull (
object); }
209 ObjectType*
object =
nullptr;
211 const ScopedPointer* getAddress() const noexcept {
return this; }
213 #if ! JUCE_MSVC // (MSVC can't deal with multiple copy constructors)
221 template <
typename ObjectType1,
typename ObjectType2>
222 bool operator== (ObjectType1* pointer1,
const ScopedPointer<ObjectType2>& pointer2) noexcept
224 return pointer1 == pointer2.
get();
228 template <
typename ObjectType1,
typename ObjectType2>
229 bool operator!= (ObjectType1* pointer1,
const ScopedPointer<ObjectType2>& pointer2) noexcept
231 return pointer1 != pointer2.get();
235 template <
typename ObjectType1,
typename ObjectType2>
236 bool operator== (
const ScopedPointer<ObjectType1>& pointer1, ObjectType2* pointer2) noexcept
238 return pointer1.get() == pointer2;
242 template <
typename ObjectType1,
typename ObjectType2>
243 bool operator!= (
const ScopedPointer<ObjectType1>& pointer1, ObjectType2* pointer2) noexcept
245 return pointer1.get() != pointer2;
249 template <
typename ObjectType1,
typename ObjectType2>
250 bool operator== (
const ScopedPointer<ObjectType1>& pointer1,
const ScopedPointer<ObjectType2>& pointer2) noexcept
252 return pointer1.get() == pointer2.get();
256 template <
typename ObjectType1,
typename ObjectType2>
257 bool operator!= (
const ScopedPointer<ObjectType1>& pointer1,
const ScopedPointer<ObjectType2>& pointer2) noexcept
259 return pointer1.get() != pointer2.get();
263 template <
class ObjectType>
264 bool operator== (decltype (
nullptr),
const ScopedPointer<ObjectType>& pointer) noexcept
266 return pointer.get() ==
nullptr;
270 template <
class ObjectType>
271 bool operator!= (decltype (
nullptr),
const ScopedPointer<ObjectType>& pointer) noexcept
273 return pointer.get() !=
nullptr;
277 template <
class ObjectType>
278 bool operator== (
const ScopedPointer<ObjectType>& pointer, decltype (
nullptr)) noexcept
280 return pointer.get() ==
nullptr;
284 template <
class ObjectType>
285 bool operator!= (
const ScopedPointer<ObjectType>& pointer, decltype (
nullptr)) noexcept
287 return pointer.get() !=
nullptr;
293 template <
typename Type>
294 void deleteAndZero (ScopedPointer<Type>&) { static_assert (
sizeof (Type) == 12345,
295 "Attempt to call deleteAndZero() on a ScopedPointer"); }