25#include "common/scummsys.h"
26#include "common/noncopyable.h"
27#include "common/safe-bool.h"
28#include "common/types.h"
55 if (--_weakRefCount == 0)
64 if (--_strongRefCount == 0) {
70 bool isAlive()
const {
71 return _strongRefCount > 0;
74 RefValue getStrongCount()
const {
75 return _strongRefCount;
79 virtual void destructObject() = 0;
82 RefValue _weakRefCount;
83 RefValue _strongRefCount;
92 void destructObject()
override {
93 static_assert(
sizeof(T) > 0,
"SharedPtr: cannot delete incomplete type");
100template<
class T,
class DL>
106 void destructObject()
override {
166 typedef T *PointerType;
167 typedef T &ReferenceType;
168 typedef BasePtrTrackerInternal::RefValue RefValue;
170 SharedPtr() : _pointer(
nullptr), _tracker(
nullptr) {
173 SharedPtr(std::nullptr_t) : _pointer(
nullptr), _tracker(
nullptr) {
178 _tracker->decStrong();
185 template<
class T2,
class DL>
191 _tracker->incStrong();
197 _tracker->incStrong();
202 if (r._tracker && r._tracker->isAlive()) {
203 _pointer = r._pointer;
204 _tracker = r._tracker;
205 _tracker->incStrong();
220 T &operator*()
const { assert(_pointer);
return *_pointer; }
221 T *operator->()
const { assert(_pointer);
return _pointer; }
229 PointerType
get()
const {
return _pointer; }
233 return _pointer == r.
get();
237 bool operator!=(
const SharedPtr<T2> &r)
const {
238 return _pointer != r.get();
241 bool operator==(std::nullptr_t)
const {
242 return _pointer ==
nullptr;
245 bool operator!=(std::nullptr_t)
const {
246 return _pointer !=
nullptr;
254 return _pointer !=
nullptr;
261 if (_tracker ==
nullptr)
263 return _tracker->getStrongCount();
280 _tracker->decStrong();
292 _pointer = r._pointer;
293 _tracker = r._tracker;
296 _tracker->incStrong();
298 oldTracker->decStrong();
308 if (r._tracker && r._tracker->isAlive()) {
309 _tracker = r._tracker;
310 _pointer = r._pointer;
311 _tracker->incStrong();
318 oldTracker->decStrong();
326 _tracker->decStrong();
345 return SharedPtr<T2>(
dynamic_cast<T2 *
>(_pointer), _tracker);
361 return SharedPtr<T2>(
reinterpret_cast<T2 *
>(_pointer), _tracker);
367 tracker->incStrong();
371 BasePtrTrackerInternal *_tracker;
387 WeakPtr() : _pointer(
nullptr), _tracker(
nullptr) {
390 WeakPtr(std::nullptr_t) : _pointer(
nullptr), _tracker(
nullptr) {
458 if (_tracker ==
nullptr)
460 return _tracker->getStrongCount();
467 return _tracker ==
nullptr || _tracker->getStrongCount() == 0;
475 return _tracker < other._tracker;
483 return _tracker < other._tracker;
492 WeakPtr<T> &operator=(
const WeakPtr<T2> &r) {
498 WeakPtr<T> &operator=(
const SharedPtr<T2> &r) {
520 _pointer = r._pointer;
521 _tracker = r._tracker;
526 oldTracker->decWeak();
536 _pointer = r._pointer;
537 _tracker = r._tracker;
542 oldTracker->decWeak();
552 BasePtrTrackerInternal *_tracker;
557 inline void operator()(T *
object) {
558 static_assert(
sizeof(T) > 0,
"cannot delete incomplete type");
565 inline void operator()(T *
object) {
566 static_assert(
sizeof(T) > 0,
"cannot delete incomplete type");
571template<
typename T,
class DL = DefaultDeleter<T> >
573 template<
class T2,
class DL2>
577 typedef T *PointerType;
578 typedef T &ReferenceType;
580 explicit ScopedPtr(PointerType o =
nullptr) : _pointer(o) {}
581 ScopedPtr(std::nullptr_t) : _pointer(
nullptr) {}
588 o._pointer =
nullptr;
591 ReferenceType operator*()
const {
return *_pointer; }
592 PointerType operator->()
const {
return _pointer; }
607 void reset(PointerType o =
nullptr) {
625 PointerType oldPointer = _pointer;
626 _pointer = other._pointer;
627 other._pointer =
nullptr;
637 PointerType
get()
const {
return _pointer; }
646 PointerType r = _pointer;
652 PointerType _pointer;
655template<
typename T,
class DL = DefaultDeleter<T> >
659 typedef T *PointerType;
660 typedef T &ReferenceType;
662 explicit DisposablePtr(PointerType o, DisposeAfterUse::Flag dispose) : _pointer(o), _dispose(dispose), _shared() {}
665 o._pointer =
nullptr;
666 o._dispose = DisposeAfterUse::NO;
671 if (_dispose) DL()(_pointer);
675 reset(o._pointer, o._dispose);
676 _shared =
move(o._shared);
677 o._pointer =
nullptr;
678 o._dispose = DisposeAfterUse::NO;
682 ReferenceType operator*()
const {
return *_pointer; }
683 PointerType operator->()
const {
return _pointer; }
694 void reset(PointerType o, DisposeAfterUse::Flag dispose) {
695 if (_dispose) DL()(_pointer);
705 reset(
nullptr, DisposeAfterUse::NO);
709 bool isDynamicallyCastable() {
710 return dynamic_cast<T2 *
>(_pointer) !=
nullptr;
716 template <
class T2,
class DL2 = DefaultDeleter<T2> >
717 DisposablePtr<T2, DL2> moveAndDynamicCast() {
718 DisposablePtr<T2, DL2> ret(
nullptr, DisposeAfterUse::NO);
719 ret._pointer =
dynamic_cast<T2 *
>(_pointer);
720 ret._dispose = _dispose;
721 ret._shared = _shared.template dynamicCast<T2>();
723 _dispose = DisposeAfterUse::NO;
733 PointerType
get()
const {
return _pointer; }
735 template <
class T2,
class DL2>
739 DisposablePtr() : _pointer(nullptr), _dispose(DisposeAfterUse::NO), _shared() {}
740 PointerType _pointer;
741 DisposeAfterUse::Flag _dispose;
742 SharedPtr<T> _shared;
751#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM) || defined(_M_ARM64))
757 UnalignedPtr(__unaligned T *ptr);
760 void store(
const T &value)
const;
767UnalignedPtr<T>::UnalignedPtr() : _ptr(nullptr) {
771UnalignedPtr<T>::UnalignedPtr(__unaligned T *ptr) : _ptr(ptr) {
775T UnalignedPtr<T>::load()
const {
780void UnalignedPtr<T>::store(
const T &value)
const {
793 void store(
const T &value)
const;
804UnalignedPtr<T>::UnalignedPtr(T *ptr) : _ptr(ptr) {
808T UnalignedPtr<T>::load()
const {
810 memcpy(&result, _ptr,
sizeof(T));
815void UnalignedPtr<T>::store(
const T &value)
const {
816 memcpy(_ptr, &value,
sizeof(T));
void reset()
Definition: ptr.h:704
bool operator_bool() const
Definition: ptr.h:689
void reset(PointerType o, DisposeAfterUse::Flag dispose)
Definition: ptr.h:694
PointerType get() const
Definition: ptr.h:733
Definition: noncopyable.h:39
void reset(PointerType o=nullptr)
Definition: ptr.h:607
PointerType get() const
Definition: ptr.h:637
ScopedPtr(ScopedPtr< T2 > &&o)
Definition: ptr.h:587
ScopedPtr & operator=(std::nullptr_t)
Definition: ptr.h:615
bool operator_bool() const
Definition: ptr.h:598
PointerType release()
Definition: ptr.h:645
ScopedPtr & operator=(ScopedPtr< T2 > &&other)
Definition: ptr.h:624
PointerType get() const
Definition: ptr.h:229
SharedPtr< T2 > constCast() const
Definition: ptr.h:352
bool unique() const
Definition: ptr.h:271
int refCount() const
Definition: ptr.h:260
void reset(const SharedPtr< T2 > &r)
Definition: ptr.h:289
bool operator_bool() const
Definition: ptr.h:253
void reset()
Definition: ptr.h:278
void reset(T *ptr)
Definition: ptr.h:324
SharedPtr< T2 > staticCast() const
Definition: ptr.h:336
SharedPtr< T2 > dynamicCast() const
Definition: ptr.h:344
SharedPtr< T2 > reinterpretCast() const
Definition: ptr.h:360
void reset(const WeakPtr< T2 > &r)
Definition: ptr.h:305
WeakPtr< T2 > constCast() const
Definition: ptr.h:435
WeakPtr< T2 > staticCast() const
Definition: ptr.h:419
bool expired() const
Definition: ptr.h:466
void reset()
Definition: ptr.h:506
WeakPtr< T2 > dynamicCast() const
Definition: ptr.h:427
bool owner_before(const WeakPtr< T2 > &other) const
Definition: ptr.h:474
bool owner_before(const SharedPtr< T2 > &other) const
Definition: ptr.h:482
int refCount() const
Definition: ptr.h:457
void reset(const WeakPtr< T2 > &r)
Definition: ptr.h:533
SharedPtr< T > lock() const
Definition: ptr.h:450
WeakPtr< T2 > reinterpretCast() const
Definition: ptr.h:443
void reset(const SharedPtr< T2 > &r)
Definition: ptr.h:517
Out move(In first, In last, Out dst)
Definition: algorithm.h:109
Definition: algorithm.h:29
Definition: safe-bool.h:56