12template <
class T>
class Ref;
57 mRefCount.fetch_add(1, memory_order_relaxed);
62 #ifndef JPH_TSAN_ENABLED
64 if (
mRefCount.fetch_sub(1, memory_order_release) == 1)
67 atomic_thread_fence(memory_order_acquire);
68 delete static_cast<const T *
>(
this);
72 if (
mRefCount.fetch_sub(1, memory_order_acq_rel) == 1)
73 delete static_cast<const T *
>(
this);
110 inline Ref() : mPtr(nullptr) { }
111 inline Ref(T *inRHS) : mPtr(inRHS) { AddRef(); }
112 inline Ref(
const Ref<T> &inRHS) : mPtr(inRHS.mPtr) { AddRef(); }
113 inline Ref(
Ref<T> &&inRHS) noexcept : mPtr(inRHS.mPtr) { inRHS.mPtr =
nullptr; }
117 inline Ref<T> &
operator = (T *inRHS) {
if (mPtr != inRHS) { Release(); mPtr = inRHS; AddRef(); }
return *
this; }
118 inline Ref<T> &
operator = (
const Ref<T> &inRHS) {
if (mPtr != inRHS.mPtr) { Release(); mPtr = inRHS.mPtr; AddRef(); }
return *
this; }
119 inline Ref<T> &
operator = (
Ref<T> &&inRHS)
noexcept {
if (mPtr != inRHS.mPtr) { Release(); mPtr = inRHS.mPtr; inRHS.mPtr =
nullptr; }
return *
this; }
122 inline operator T *()
const {
return mPtr; }
129 inline bool operator == (
const T * inRHS)
const {
return mPtr == inRHS; }
131 inline bool operator != (
const T * inRHS)
const {
return mPtr != inRHS; }
135 inline T *
GetPtr()
const {
return mPtr; }
150 inline void AddRef() {
if (mPtr !=
nullptr) mPtr->AddRef(); }
151 inline void Release() {
if (mPtr !=
nullptr) mPtr->Release(); }
167 inline RefConst(
const T * inRHS) : mPtr(inRHS) { AddRef(); }
171 inline RefConst(
Ref<T> &&inRHS) noexcept : mPtr(inRHS.mPtr) { inRHS.mPtr =
nullptr; }
175 inline RefConst<T> &
operator = (
const T * inRHS) {
if (mPtr != inRHS) { Release(); mPtr = inRHS; AddRef(); }
return *
this; }
179 inline RefConst<T> &
operator = (
Ref<T> &&inRHS)
noexcept {
if (mPtr != inRHS.mPtr) { Release(); mPtr = inRHS.mPtr; inRHS.mPtr =
nullptr; }
return *
this; }
182 inline operator const T * ()
const {
return mPtr; }
189 inline bool operator == (
const T * inRHS)
const {
return mPtr == inRHS; }
192 inline bool operator != (
const T * inRHS)
const {
return mPtr != inRHS; }
197 inline const T *
GetPtr()
const {
return mPtr; }
210 inline void AddRef() {
if (mPtr !=
nullptr) mPtr->AddRef(); }
211 inline void Release() {
if (mPtr !=
nullptr) mPtr->Release(); }
218JPH_SUPPRESS_WARNING_PUSH
225 struct hash<JPH::
Ref<T>>
227 size_t operator () (
const JPH::Ref<T> &inRHS)
const
229 return size_t(inRHS.GetHash());
237 size_t operator () (
const JPH::RefConst<T> &inRHS)
const
239 return size_t(inRHS.GetHash());
244JPH_SUPPRESS_WARNING_POP
#define JPH_EXPORT
Definition Core.h:271
std::uint64_t uint64
Definition Core.h:485
#define JPH_NAMESPACE_END
Definition Core.h:414
#define JPH_CLANG_SUPPRESS_WARNING(w)
Definition Core.h:298
std::uint32_t uint32
Definition Core.h:484
#define JPH_NAMESPACE_BEGIN
Definition Core.h:408
#define JPH_IF_ENABLE_ASSERTS(...)
Definition IssueReporting.h:35
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
Definition Reference.h:163
const T * GetPtr() const
Get pointer.
Definition Reference.h:197
bool operator!=(const T *inRHS) const
Definition Reference.h:192
RefConst()
Constructor.
Definition Reference.h:166
~RefConst()
Definition Reference.h:172
RefConst(const T *inRHS)
Definition Reference.h:167
const T & operator*() const
Definition Reference.h:186
RefConst< T > & operator=(const T *inRHS)
Assignment operators.
Definition Reference.h:175
RefConst(const Ref< T > &inRHS)
Definition Reference.h:170
void ** InternalGetPointer()
INTERNAL HELPER FUNCTION USED BY SERIALIZATION.
Definition Reference.h:206
const T * operator->() const
Access like a normal pointer.
Definition Reference.h:185
RefConst(RefConst< T > &&inRHS) noexcept
Definition Reference.h:169
uint64 GetHash() const
Get hash for this object.
Definition Reference.h:200
RefConst(const RefConst< T > &inRHS)
Definition Reference.h:168
bool operator==(const T *inRHS) const
Comparison.
Definition Reference.h:189
RefConst(Ref< T > &&inRHS) noexcept
Definition Reference.h:171
Definition Reference.h:107
Ref(const Ref< T > &inRHS)
Definition Reference.h:112
T * GetPtr() const
Get pointer.
Definition Reference.h:135
bool operator!=(const T *inRHS) const
Definition Reference.h:131
Ref()
Constructor.
Definition Reference.h:110
~Ref()
Definition Reference.h:114
T * operator->() const
Access like a normal pointer.
Definition Reference.h:125
void ** InternalGetPointer()
INTERNAL HELPER FUNCTION USED BY SERIALIZATION.
Definition Reference.h:144
Ref< T > & operator=(T *inRHS)
Assignment operators.
Definition Reference.h:117
Ref(Ref< T > &&inRHS) noexcept
Definition Reference.h:113
Ref(T *inRHS)
Definition Reference.h:111
uint64 GetHash() const
Get hash for this object.
Definition Reference.h:138
bool operator==(const T *inRHS) const
Comparison.
Definition Reference.h:129
T & operator*() const
Definition Reference.h:126
Definition Reference.h:35
void Release() const
Definition Reference.h:60
atomic< uint32 > mRefCount
Current reference count.
Definition Reference.h:83
RefTarget & operator=(const RefTarget &)
Assignment operator.
Definition Reference.h:48
void SetEmbedded() const
Definition Reference.h:45
RefTarget()=default
Constructor.
RefTarget(const RefTarget &)
Definition Reference.h:39
static int sInternalGetRefCountOffset()
INTERNAL HELPER FUNCTION USED BY SERIALIZATION.
Definition Reference.h:78
~RefTarget()
assert no one is referencing us
Definition Reference.h:40
uint32 GetRefCount() const
Get current refcount of this object.
Definition Reference.h:51
void AddRef() const
Add or release a reference to this object.
Definition Reference.h:54
static constexpr uint32 cEmbedded
A large value that gets added to the refcount to mark the object as embedded.
Definition Reference.h:81
Pure virtual version of RefTarget.
Definition Reference.h:88
virtual ~RefTargetVirtual()=default
Virtual destructor.
virtual void Release()=0
Virtual release reference.
virtual void AddRef()=0
Virtual add reference.
Fallback hash function that calls T::GetHash()
Definition HashCombine.h:59