11#include "Templates/Invoke.h"
101 static constexpr uint32 RefCountMask = 0x3fffffff;
105 static constexpr inline uint64 SetSharedRefCount(
uint32 RefCount) {
return uint64(RefCount) << 0; }
107 static constexpr inline uint64 SetWeakRefCount(
uint32 RefCount) {
return uint64(RefCount) << 30; }
112 inline bool IsUniqueOwnedMutable()
const;
114 inline void AddSharedReference();
115 inline void ReleaseSharedReference();
116 inline bool TryAddSharedReference();
117 inline void AddWeakReference();
118 inline void ReleaseWeakReference();
127 void* Data =
nullptr;
129 std::atomic<uint64> ReferenceCountsAndFlags{0};
137struct FSharedOps final
153template <
typename FOps>
154class TBufferOwnerPtr final
156 static constexpr bool bIsWeak = std::is_same<FOps, FWeakOps>::value;
158 template <
typename FOtherOps>
159 friend class TBufferOwnerPtr;
161 template <
typename FOtherOps>
164 template <
typename FOtherOps>
168 inline TBufferOwnerPtr() =
default;
171 inline TBufferOwnerPtr(
const TBufferOwnerPtr& Ptr);
172 inline TBufferOwnerPtr(TBufferOwnerPtr&& Ptr);
174 template <
typename FOtherOps>
176 template <
typename FOtherOps>
179 inline ~TBufferOwnerPtr();
181 inline TBufferOwnerPtr& operator=(
const TBufferOwnerPtr& Ptr);
182 inline TBufferOwnerPtr& operator=(TBufferOwnerPtr&& Ptr);
184 template <
typename FOtherOps>
186 template <
typename FOtherOps>
189 template <
typename FOtherOps>
191 template <
typename FOtherOps>
196 inline explicit operator bool()
const {
return !IsNull(); }
197 inline bool IsNull()
const {
return Owner ==
nullptr; }
239 decltype(
Invoke(std::declval<DeleteFunctionType>(), std::declval<void*>()))* =
nullptr>
248 decltype(
Invoke(std::declval<DeleteFunctionType>(), std::declval<void*>(), std::declval<uint64>()))* =
nullptr>
268 [[
nodiscard]]
inline const void*
GetData()
const {
return Owner ? Owner->GetData() :
nullptr; }
315 using FOwnerPtrType = UE::SharedBuffer::Private::TBufferOwnerPtr<UE::SharedBuffer::Private::FSharedOps>;
328#if !PLATFORM_COMPILER_HAS_GENERATED_COMPARISON_OPERATORS
363 decltype(
Invoke(std::declval<DeleteFunctionType>(), std::declval<void*>()))* =
nullptr>
372 decltype(
Invoke(std::declval<DeleteFunctionType>(), std::declval<void*>(), std::declval<uint64>()))* =
nullptr>
433 using FOwnerPtrType = UE::SharedBuffer::Private::TBufferOwnerPtr<UE::SharedBuffer::Private::FSharedOps>;
434 using FWeakOwnerPtrType = UE::SharedBuffer::Private::TBufferOwnerPtr<UE::SharedBuffer::Private::FWeakOps>;
449#if !PLATFORM_COMPILER_HAS_GENERATED_COMPARISON_OPERATORS
483 using FWeakOwnerPtrType = UE::SharedBuffer::Private::TBufferOwnerPtr<UE::SharedBuffer::Private::FWeakOps>;
487 FWeakOwnerPtrType
Owner;
495#if !PLATFORM_COMPILER_HAS_GENERATED_COMPARISON_OPERATORS
520template <
typename DeleteFunctionType>
539 virtual void FreeBuffer() final
544 std::decay_t<DeleteFunctionType> DeleteFunction;
550 decltype(
Invoke(std::declval<DeleteFunctionType>(), std::declval<void*>()))*>
560 decltype(
Invoke(std::declval<DeleteFunctionType>(), std::declval<void*>(), std::declval<uint64>()))*>
568 decltype(
Invoke(std::declval<DeleteFunctionType>(), std::declval<void*>()))*>
578 decltype(
Invoke(std::declval<DeleteFunctionType>(), std::declval<void*>(), std::declval<uint64>()))*>
592 Materialized = 1 << 2,
672 return GetTotalRefCount(ReferenceCountsAndFlags.load(std::memory_order_relaxed));
683inline bool FBufferOwner::IsUniqueOwnedMutable()
const
690inline void FBufferOwner::AddSharedReference()
692 const uint64 PreviousValue = ReferenceCountsAndFlags.fetch_add(SetSharedRefCount(1), std::memory_order_relaxed);
693 checkSlow(GetSharedRefCount(PreviousValue) < RefCountMask);
694 if (GetSharedRefCount(PreviousValue) == 0)
700inline void FBufferOwner::ReleaseSharedReference()
702 const uint64 PreviousValue = ReferenceCountsAndFlags.fetch_sub(SetSharedRefCount(1), std::memory_order_acq_rel);
703 checkSlow(GetSharedRefCount(PreviousValue) > 0);
704 if (GetSharedRefCount(PreviousValue) == 1)
709 ReleaseWeakReference();
713inline bool FBufferOwner::TryAddSharedReference()
715 for (
uint64 Value = ReferenceCountsAndFlags.load(std::memory_order_relaxed);;)
717 if (GetSharedRefCount(
Value) == 0)
721 if (ReferenceCountsAndFlags.compare_exchange_weak(
Value,
Value + SetSharedRefCount(1),
722 std::memory_order_relaxed, std::memory_order_relaxed))
729inline void FBufferOwner::AddWeakReference()
731 const uint64 PreviousValue = ReferenceCountsAndFlags.fetch_add(SetWeakRefCount(1), std::memory_order_relaxed);
732 checkSlow(GetWeakRefCount(PreviousValue) < RefCountMask);
735inline void FBufferOwner::ReleaseWeakReference()
737 const uint64 PreviousValue = ReferenceCountsAndFlags.fetch_sub(SetWeakRefCount(1), std::memory_order_acq_rel);
738 checkSlow(GetWeakRefCount(PreviousValue) > 0);
739 if (GetWeakRefCount(PreviousValue) == 1)
750template <
typename FOps>
751template <
typename FOtherOps>
757 if constexpr (bIsWeak || !TBufferOwnerPtr<FOtherOps>::bIsWeak)
761 else if (!FOps::TryAddRef(*
NewOwner))
769template <
typename FOps>
770template <
typename FOtherOps>
774 if constexpr (bIsWeak == TBufferOwnerPtr<FOtherOps>::bIsWeak)
780 if constexpr (bIsWeak)
784 else if (!FOps::TryAddRef(*
NewOwner))
792template <
typename FOps>
793inline TBufferOwnerPtr<FOps>::TBufferOwnerPtr(
const TBufferOwnerPtr& Ptr)
794 :
Owner(CopyFrom(Ptr))
798template <
typename FOps>
799inline TBufferOwnerPtr<FOps>::TBufferOwnerPtr(TBufferOwnerPtr&& Ptr)
804template <
typename FOps>
805template <
typename FOtherOps>
807 :
Owner(CopyFrom(Ptr))
811template <
typename FOps>
812template <
typename FOtherOps>
818template <
typename FOps>
819inline TBufferOwnerPtr<FOps>::~TBufferOwnerPtr()
821 FOps::Release(
Owner);
824template <
typename FOps>
828 Owner = CopyFrom(Ptr);
833template <
typename FOps>
842template <
typename FOps>
843template <
typename FOtherOps>
847 Owner = CopyFrom(Ptr);
852template <
typename FOps>
853template <
typename FOtherOps>
862template <
typename FOps>
863template <
typename FOtherOps>
866 return Owner == Ptr.Owner;
869template <
typename FOps>
870template <
typename FOtherOps>
873 return Owner != Ptr.Owner;
883template <
typename T,
typename Allocator>
896 virtual void FreeBuffer() final
907template <
typename T,
typename Allocator>
914template <
typename T,
typename Allocator>
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define checkSlow(expr)
Definition AssertionMacros.h:332
FSharedBuffer MakeSharedBufferFromArray(TArray< T, Allocator > &&Array)
Definition SharedBuffer.h:915
FUniqueBuffer MakeUniqueBufferFromArray(TArray< T, Allocator > &&Array)
Definition SharedBuffer.h:908
AUTORTFM_INFER UE_FORCEINLINE_HINT constexpr auto Invoke(FuncType &&Func, ArgTypes &&... Args) -> decltype(((FuncType &&) Func)((ArgTypes &&) Args...))
Definition Invoke.h:44
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
#define FRIEND_ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:17
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
UE_FORCEINLINE_HINT bool operator!=(const FIndexedPointer &Other) const
Definition LockFreeList.h:76
TMemoryView< const void > FMemoryView
Definition MemoryFwd.h:11
TMemoryView< void > FMutableMemoryView
Definition MemoryFwd.h:14
const bool
Definition NetworkReplayStreaming.h:178
auto GetData(const TStringConversion< Converter, DefaultConversionSize > &Conversion) -> decltype(Conversion.Get())
Definition StringConv.h:802
uint32 PointerHash(const void *Key)
Definition TypeHash.h:91
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Size
Definition VulkanMemory.cpp:4034
Definition SharedBuffer.h:52
void SetBuffer(void *InData, uint64 InSize)
Definition SharedBuffer.h:625
bool IsImmutable() const
Definition SharedBuffer.h:641
EBufferOwnerFlags
Definition SharedBuffer.h:588
void SetIsOwned()
Definition SharedBuffer.h:636
void Materialize()
Definition SharedBuffer.h:651
void * GetData()
Definition SharedBuffer.h:613
virtual void FreeBuffer()=0
bool IsMaterialized() const
Definition SharedBuffer.h:660
bool IsOwned() const
Definition SharedBuffer.h:631
uint64 GetSize()
Definition SharedBuffer.h:619
friend struct UE::SharedBuffer::Private::FSharedOps
Definition SharedBuffer.h:123
void SetIsImmutable()
Definition SharedBuffer.h:646
virtual ~FBufferOwner()
Definition SharedBuffer.h:603
friend struct UE::SharedBuffer::Private::FWeakOps
Definition SharedBuffer.h:124
FBufferOwner & operator=(const FBufferOwner &)=delete
virtual void MaterializeBuffer()
Definition SharedBuffer.h:608
void SetIsMaterialized()
Definition SharedBuffer.h:665
FBufferOwner(const FBufferOwner &)=delete
uint32 GetTotalRefCount() const
Definition SharedBuffer.h:670
Definition SharedBuffer.h:341
friend FOwnerPtrType ToPrivateOwnerPtr(FSharedBuffer &&Buffer)
Definition SharedBuffer.h:440
FMemoryView GetView() const
Definition SharedBuffer.h:391
friend class FWeakSharedBuffer
Definition SharedBuffer.h:430
bool IsOwned() const
Definition SharedBuffer.h:405
bool IsMaterialized() const
Definition SharedBuffer.h:412
friend class FUniqueBuffer
Definition SharedBuffer.h:429
static FSharedBuffer TakeOwnership(const void *Data, uint64 Size, DeleteFunctionType &&DeleteFunction)
friend const FOwnerPtrType & ToPrivateOwnerPtr(const FSharedBuffer &Buffer)
Definition SharedBuffer.h:439
friend uint32 GetTypeHash(const FSharedBuffer &Buffer)
Definition SharedBuffer.h:445
uint64 GetSize() const
Definition SharedBuffer.h:388
const void * GetData() const
Definition SharedBuffer.h:385
friend bool operator==(const FSharedBuffer &BufferA, const FUniqueBuffer &BufferB)
Definition SharedBuffer.h:447
bool operator!=(const FSharedBuffer &BufferB) const
Definition SharedBuffer.h:450
friend bool operator!=(const FSharedBuffer &BufferA, const FUniqueBuffer &BufferB)
Definition SharedBuffer.h:451
static FSharedBuffer TakeOwnership(const void *Data, uint64 Size, DeleteFunctionType &&DeleteFunction)
Definition SharedBuffer.h:569
friend bool operator==(const FUniqueBuffer &BufferA, const FSharedBuffer &BufferB)
Definition SharedBuffer.h:452
bool operator==(const FSharedBuffer &BufferB) const
Definition SharedBuffer.h:446
bool IsNull() const
Definition SharedBuffer.h:402
friend bool operator!=(const FUniqueBuffer &BufferA, const FSharedBuffer &BufferB)
Definition SharedBuffer.h:453
Definition SharedBuffer.h:218
FUniqueBuffer & operator=(FUniqueBuffer &&)=default
static CORE_API FUniqueBuffer Alloc(uint64 Size)
Definition SharedBuffer.cpp:103
CORE_API FUniqueBuffer MakeOwned() &&
Definition SharedBuffer.cpp:152
FUniqueBuffer(const FUniqueBuffer &)=delete
const void * GetData() const
Definition SharedBuffer.h:268
FMemoryView GetView() const
Definition SharedBuffer.h:275
CORE_API FSharedBuffer MoveToShared()
Definition SharedBuffer.cpp:165
static FUniqueBuffer TakeOwnership(void *Data, uint64 Size, DeleteFunctionType &&DeleteFunction)
Definition SharedBuffer.h:551
FUniqueBuffer(FUniqueBuffer &&)=default
friend class FSharedBuffer
Definition SharedBuffer.h:312
static FUniqueBuffer TakeOwnership(void *Data, uint64 Size, DeleteFunctionType &&DeleteFunction)
bool operator==(const FUniqueBuffer &BufferB) const
Definition SharedBuffer.h:327
static CORE_API FUniqueBuffer Clone(FMemoryView View)
Definition SharedBuffer.cpp:115
bool IsNull() const
Definition SharedBuffer.h:287
CORE_API void Materialize() const
Definition SharedBuffer.cpp:157
friend FOwnerPtrType ToPrivateOwnerPtr(FUniqueBuffer &&Buffer)
Definition SharedBuffer.h:320
CORE_API void Reset()
Definition SharedBuffer.cpp:147
static CORE_API FUniqueBuffer MakeView(FMutableMemoryView View)
Definition SharedBuffer.cpp:127
friend uint32 GetTypeHash(const FUniqueBuffer &Buffer)
Definition SharedBuffer.h:325
FUniqueBuffer & operator=(const FUniqueBuffer &)=delete
void * GetData()
Definition SharedBuffer.h:267
uint64 GetSize() const
Definition SharedBuffer.h:271
FMutableMemoryView GetView()
Definition SharedBuffer.h:274
bool IsMaterialized() const
Definition SharedBuffer.h:296
bool operator!=(const FUniqueBuffer &BufferB) const
Definition SharedBuffer.h:329
friend const FOwnerPtrType & ToPrivateOwnerPtr(const FUniqueBuffer &Buffer)
Definition SharedBuffer.h:319
bool IsOwned() const
Definition SharedBuffer.h:290
static CORE_API FUniqueBuffer AllocZeroed(uint64 Size)
Definition SharedBuffer.cpp:108
Definition SharedBuffer.h:465
friend bool operator!=(const FWeakSharedBuffer &BufferA, const FSharedBuffer &BufferB)
Definition SharedBuffer.h:502
bool operator!=(const FWeakSharedBuffer &BufferB) const
Definition SharedBuffer.h:499
friend bool operator!=(const FUniqueBuffer &BufferA, const FWeakSharedBuffer &BufferB)
Definition SharedBuffer.h:501
friend bool operator!=(const FSharedBuffer &BufferA, const FWeakSharedBuffer &BufferB)
Definition SharedBuffer.h:503
bool operator==(const FWeakSharedBuffer &BufferB) const
Definition SharedBuffer.h:491
friend bool operator==(const FSharedBuffer &BufferA, const FWeakSharedBuffer &BufferB)
Definition SharedBuffer.h:497
FWeakSharedBuffer()=default
friend bool operator==(const FWeakSharedBuffer &BufferA, const FUniqueBuffer &BufferB)
Definition SharedBuffer.h:492
friend bool operator==(const FWeakSharedBuffer &BufferA, const FSharedBuffer &BufferB)
Definition SharedBuffer.h:493
friend bool operator!=(const FWeakSharedBuffer &BufferA, const FUniqueBuffer &BufferB)
Definition SharedBuffer.h:500
friend const FWeakOwnerPtrType & ToPrivateOwnerPtr(const FWeakSharedBuffer &Buffer)
Definition SharedBuffer.h:485
friend uint32 GetTypeHash(const FWeakSharedBuffer &Buffer)
Definition SharedBuffer.h:490
friend bool operator==(const FUniqueBuffer &BufferA, const FWeakSharedBuffer &BufferB)
Definition SharedBuffer.h:496
Definition SharedBuffer.h:522
TBufferOwnerDeleteFunction(void *Data, uint64 Size, DeleteFunctionType &&InDeleteFunction)
Definition SharedBuffer.h:524
TBufferOwnerDeleteFunction(const void *Data, uint64 Size, DeleteFunctionType &&InDeleteFunction)
Definition SharedBuffer.h:532
Definition SharedBuffer.h:885
TBufferOwnerTArray(TArray< T, Allocator > &&InArray)
Definition SharedBuffer.h:887
GeometryCollection::Facades::FMuscleActivationData Data
Definition MuscleActivationConstraints.h:15
FORCEINLINE T * Get(const FObjectPtr &ObjectPtr)
Definition ObjectPtr.h:426
bool operator==(const FCachedAssetKey &A, const FCachedAssetKey &B)
Definition AssetDataMap.h:501
Definition SharedBuffer.cpp:11
Definition UnrealTypeTraits.h:181
Definition UnrealTypeTraits.h:172