18#define THREAD_SANITISE_UNSAFEPTR 0
20#if THREAD_SANITISE_UNSAFEPTR
21 #define TSAN_SAFE_UNSAFEPTR
23 #define TSAN_SAFE_UNSAFEPTR TSAN_SAFE
43 template <ESPMode Mode>
46 using RefCountType = std::conditional_t<Mode == ESPMode::ThreadSafe, std::atomic<int32>,
int32>;
113#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86))
148 bool bSucceeded =
false;
254 if (ReferenceController !=
nullptr)
269#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86))
311#if !defined(__clang_analyzer__)
325#if !defined(__clang_analyzer__)
341 template <
typename DeleterType,
bool bIsZeroSize = std::is_empty_v<DeleterType>>
349 template <
typename ObjectType>
356 template <
typename DeleterType>
364 template <
typename ObjectType>
374 template <
typename ObjectType,
typename DeleterType, ESPMode Mode>
398 template <
typename ObjectType, ESPMode Mode>
430 return (ObjectType*)&ObjectStorage;
449 template <
typename Type>
459 template <ESPMode Mode,
typename ObjectType>
466 template <ESPMode Mode,
typename ObjectType,
typename DeleterType>
482 template <
class ObjectType>
504 template <
class ObjectType,
typename DeleterType>
533 template< ESPMode Mode >
540 : ReferenceController( nullptr )
554 if( ReferenceController !=
nullptr )
556 ReferenceController->AddSharedReference();
574 if (ReferenceController !=
nullptr)
579 if (!ReferenceController->ConditionallyAddSharedReference())
581 ReferenceController =
nullptr;
593 if( ReferenceController !=
nullptr )
598 if( !ReferenceController->ConditionallyAddSharedReference() )
600 ReferenceController =
nullptr;
631 if( ReferenceController !=
nullptr )
633 ReferenceController->ReleaseSharedReference();
673 return ReferenceController !=
nullptr;
683 return ReferenceController !=
nullptr ? ReferenceController->GetSharedReferenceCount() : 0;
694 return ReferenceController !=
nullptr && ReferenceController->IsUnique();
713 template< ESPMode Mode >
720 : ReferenceController( nullptr )
728 if( ReferenceController !=
nullptr )
730 ReferenceController->AddWeakReference();
746 if( ReferenceController !=
nullptr )
748 ReferenceController->AddWeakReference();
755 if( ReferenceController !=
nullptr )
759 ReferenceController->ReleaseWeakReference();
803 return ReferenceController !=
nullptr && ReferenceController->GetSharedReferenceCount() > 0;
822 if( ReferenceController !=
nullptr )
824 ReferenceController->ReleaseWeakReference();
848 struct FSharedFromThisBase
856 return std::is_base_of_v<UE::Core::Private::FSharedFromThisBase, T>;
863 template<
class SharedPtrType,
class ObjectType >
873 if( InObject !=
nullptr )
875 InObject->UpdateWeakReferenceInternal(
InSharedPtrOrRef,
const_cast< ObjectType*
>( InObject ) );
#define checkSlow(expr)
Definition AssertionMacros.h:332
AUTORTFM_INFER UE_FORCEINLINE_HINT constexpr auto Invoke(FuncType &&Func, ArgTypes &&... Args) -> decltype(((FuncType &&) Func)((ArgTypes &&) Args...))
Definition Invoke.h:44
FORCEINLINE constexpr void DestructItem(ElementType *Element)
Definition MemoryOps.h:56
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
ESPMode
Definition SharedPointerFwd.h:12
constexpr bool IsDerivedFromSharedFromThis()
Definition SharedPointerInternals.h:854
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition SharedPointerInternals.h:535
FSharedReferencer(FSharedReferencer const &InSharedReference)
Definition SharedPointerInternals.h:549
FSharedReferencer & operator=(FSharedReferencer &&InSharedReference)
Definition SharedPointerInternals.h:645
UE_FORCEINLINE_HINT FSharedReferencer()
Definition SharedPointerInternals.h:539
FSharedReferencer(FWeakReferencer< Mode > &&InWeakReference)
Definition SharedPointerInternals.h:588
UE_FORCEINLINE_HINT const int32 GetSharedReferenceCount() const
Definition SharedPointerInternals.h:681
UE_FORCEINLINE_HINT const bool IsUnique() const
Definition SharedPointerInternals.h:692
FSharedReferencer & operator=(FSharedReferencer const &InSharedReference)
Definition SharedPointerInternals.h:618
UE_FORCEINLINE_HINT const bool IsValid() const
Definition SharedPointerInternals.h:671
FSharedReferencer(FWeakReferencer< Mode > const &InWeakReference)
Definition SharedPointerInternals.h:569
~FSharedReferencer()
Definition SharedPointerInternals.h:611
FSharedReferencer(TReferenceControllerBase< Mode > *InReferenceController)
Definition SharedPointerInternals.h:544
FSharedReferencer(FSharedReferencer &&InSharedReference)
Definition SharedPointerInternals.h:561
Definition SharedPointerInternals.h:715
FWeakReferencer(FWeakReferencer const &InWeakRefCountPointer)
Definition SharedPointerInternals.h:724
FWeakReferencer & operator=(FSharedReferencer< Mode > const &InSharedReference)
Definition SharedPointerInternals.h:789
UE_FORCEINLINE_HINT const bool IsValid() const
Definition SharedPointerInternals.h:801
~FWeakReferencer()
Definition SharedPointerInternals.h:753
FWeakReferencer(FSharedReferencer< Mode > const &InSharedRefCountPointer)
Definition SharedPointerInternals.h:742
FWeakReferencer & operator=(FWeakReferencer const &InWeakReference)
Definition SharedPointerInternals.h:765
FWeakReferencer(FWeakReferencer &&InWeakRefCountPointer)
Definition SharedPointerInternals.h:735
FWeakReferencer & operator=(FWeakReferencer &&InWeakReference)
Definition SharedPointerInternals.h:774
UE_FORCEINLINE_HINT FWeakReferencer()
Definition SharedPointerInternals.h:719
Definition SharedPointerInternals.h:400
TIntrusiveReferenceController & operator=(const TIntrusiveReferenceController &)=delete
ObjectType * GetObjectPtr() const
Definition SharedPointerInternals.h:428
TIntrusiveReferenceController(ArgTypes &&... Args)
Definition SharedPointerInternals.h:403
TIntrusiveReferenceController(const TIntrusiveReferenceController &)=delete
virtual void DestroyObject() override
Definition SharedPointerInternals.h:433
Definition SharedPointerInternals.h:45
virtual void DestroyObject()=0
void ReleaseWeakReference()
Definition SharedPointerInternals.h:296
static FORCENOINLINE void ReleaseSharedReferenceNoInline(TReferenceControllerBase< Mode > *ReferenceController)
Definition SharedPointerInternals.h:252
void AddWeakReference()
Definition SharedPointerInternals.h:263
void ReleaseSharedReference()
Definition SharedPointerInternals.h:212
void AddSharedReference()
Definition SharedPointerInternals.h:106
bool ConditionallyAddSharedReference()
Definition SharedPointerInternals.h:144
int32 GetSharedReferenceCount() const
Definition SharedPointerInternals.h:73
TReferenceControllerBase(const TReferenceControllerBase &)=delete
RefCountType WeakReferenceCount
Definition SharedPointerInternals.h:63
RefCountType SharedReferenceCount
Definition SharedPointerInternals.h:56
UE_FORCEINLINE_HINT bool IsUnique() const
Definition SharedPointerInternals.h:100
TReferenceControllerBase & operator=(const TReferenceControllerBase &)=delete
virtual ~TReferenceControllerBase()
Definition SharedPointerInternals.h:68
UE_FORCEINLINE_HINT TReferenceControllerBase()=default
Definition SharedPointerInternals.h:376
virtual void DestroyObject() override
Definition SharedPointerInternals.h:384
TReferenceControllerWithDeleter(ObjectType *InObject, DeleterType &&Deleter)
Definition SharedPointerInternals.h:378
TReferenceControllerWithDeleter & operator=(const TReferenceControllerWithDeleter &)=delete
TReferenceControllerWithDeleter(const TReferenceControllerWithDeleter &)=delete
Definition SharedPointerInternals.h:32
TIntrusiveReferenceController< ObjectType, Mode > * NewIntrusiveReferenceController(ArgTypes &&... Args)
Definition SharedPointerInternals.h:474
TReferenceControllerBase< Mode > * NewCustomReferenceController(ObjectType *Object, DeleterType &&Deleter)
Definition SharedPointerInternals.h:467
void EnableSharedFromThis(SharedPtrType *InSharedPtrOrRef, ObjectType const *InObject)
Definition SharedPointerInternals.h:864
TReferenceControllerBase< Mode > * NewDefaultReferenceController(ObjectType *Object)
Definition SharedPointerInternals.h:460
implementation
Definition PlayInEditorLoadingScope.h:8
@ false
Definition radaudio_common.h:23
Definition SharedPointerInternals.h:451
UE_FORCEINLINE_HINT void operator()(Type *Object) const
Definition SharedPointerInternals.h:452
Definition SharedPointerInternals.h:38
Definition SharedPointerInternals.h:41
Definition SharedPointerInternals.h:37
TDeleterHolder(DeleterType &&Arg)
Definition SharedPointerInternals.h:359
void InvokeDeleter(ObjectType *Object)
Definition SharedPointerInternals.h:365
Definition SharedPointerInternals.h:343
void InvokeDeleter(ObjectType *Object)
Definition SharedPointerInternals.h:350
TDeleterHolder(DeleterType &&Arg)
Definition SharedPointerInternals.h:344
Definition SharedPointerInternals.h:506
TRawPtrProxyWithDeleter(ObjectType *InObject, DeleterType &&InDeleter)
Definition SharedPointerInternals.h:521
DeleterType Deleter
Definition SharedPointerInternals.h:511
TRawPtrProxyWithDeleter(ObjectType *InObject, const DeleterType &InDeleter)
Definition SharedPointerInternals.h:514
ObjectType * Object
Definition SharedPointerInternals.h:508
Definition SharedPointerInternals.h:484
UE_FORCEINLINE_HINT TRawPtrProxy(TYPE_OF_NULLPTR)
Definition SharedPointerInternals.h:489
ObjectType * Object
Definition SharedPointerInternals.h:486
UE_FORCEINLINE_HINT TRawPtrProxy(ObjectType *InObject)
Definition SharedPointerInternals.h:495
Definition TypeCompatibleBytes.h:24