23 template<
typename ObjectType>
63 template<
typename...
TArgs>
70 ObjectType*
NewPtr = AddBlock().GetNextFree();
79 if (Blocks[0].IsFull())
90 SelectedIndex =
Index;
96 Swap(Blocks[0], Blocks[SelectedIndex]);
104 ObjectType*
NewPtr = Blocks[0].GetNextFree();
134 for(FBlock&
B : Blocks)
139 FreeCount = Blocks.
Num() * NumPerBlock;
163 return (PaddedItemSize * NumPerBlock) * Blocks.
Num();
202 while(NumBlocks > Blocks.
Num())
220 const int32 BlockSize = NumPerBlock * PaddedItemSize;
221 const int32 NumBlocks =
int32(FMath::CeilToInt(
static_cast<double>(
ItemsSize) / BlockSize));
232 return static_cast<float>(
sizeof(ObjectType)) / PaddedItemSize;
264 template<
typename T_ = ObjectType,
typename Destructible =
void>
286 template<
typename T_>
315 constexpr static int32 PaddedItemSize =
Align(
int32(
sizeof(FItem)), ItemAlign);
327 , NumFree(NumInBlock)
352 if(NumValid < NumInBlock)
364 checkf(
false,
TEXT(
"Attempt to request a free item from a full block (Freelist is empty, NumValid is %d, NumInBlock is %d, NumFree is %d)"), NumValid, NumInBlock, NumFree);
371 checkf(Owns(
Object),
TEXT(
"A pointer was passed to an object pool block that it does not own."));
384 AsItem->NextFree = FreeList;
387 FreeList = (
int32)IndexInBlock;
396 NumFree = NumInBlock;
403 for(
int32 i = 0; i < NumValid; ++i)
410 bool Owns(ObjectType*
InPtr)
const
419 return NumFree == NumInBlock;
428 FItem*
Begin =
nullptr;
430 FItem*
Next =
nullptr;
433 const int32 NumInBlock;
448 Blocks.Emplace(NumPerBlock);
451 Capacity += NumPerBlock;
452 FreeCount += NumPerBlock;
454 return Blocks.Last();
465 for(
int32 i = 0; i < Blocks.Num(); ++i)
467 if(Blocks[i].Owns(
InPtr))
473 checkf(
false,
TEXT(
"A pointer was passed to an object pool method that it does not own."));
512 FItem*
AsItem =
reinterpret_cast<FItem*
>(At);
528 static void ConditionalDestruct(ObjectType* At)
534 FItem*
AsItem =
reinterpret_cast<FItem*
>(At);
550 static void ConditionalDestruct(ObjectType*)
555 int32 NumPerBlock = 0;
564 template<
typename ObjectPoolType>
569 using FObject =
typename FObjectPool::FObject;
585 check(Pool !=
nullptr);
595#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_5
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
@ INDEX_NONE
Definition CoreMiscDefines.h:150
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void Construct(const FArguments &InArgs)
uint32 Offset
Definition VulkanMemory.cpp:4033
int BlockIndex
Definition binka_ue_decode_test.cpp:38
Definition ObjectPool.h:566
TObjectPoolDeleter()
Definition ObjectPool.h:571
typename FObjectPool::FObject FObject
Definition ObjectPool.h:569
ObjectPoolType FObjectPool
Definition ObjectPool.h:568
TObjectPoolDeleter(FObjectPool &InPool)
Definition ObjectPool.h:576
void operator()(FObject *Object)
Definition ObjectPool.h:581
Definition ObjectPool.h:25
int32 GetCapacity() const
Definition ObjectPool.h:256
FPtr Alloc(TArgs &&... Args)
Definition ObjectPool.h:64
void ShrinkTo(int32 NumDesiredEmptyBlocks)
Definition ObjectPool.h:172
~TObjectPool()
Definition ObjectPool.h:40
void Free(FPtr Object)
Definition ObjectPool.h:119
ObjectType FObject
Definition ObjectPool.h:31
void Reset()
Definition ObjectPool.h:132
int32 GetNumPerBlock() const
Definition ObjectPool.h:153
static constexpr int32 ItemAlign
Definition ObjectPool.h:29
TObjectPool(TObjectPool &&)=delete
TObjectPool(const TObjectPool &)=delete
int32 GetNumAllocatedBlocks() const
Definition ObjectPool.h:145
int32 GetNumFree() const
Definition ObjectPool.h:247
ObjectType * FPtr
Definition ObjectPool.h:32
int32 GetAllocatedSize() const
Definition ObjectPool.h:161
int32 GetNumAllocated() const
Definition ObjectPool.h:238
TObjectPool & operator=(TObjectPool &&)=delete
void ReserveBlocks(int32 NumBlocks)
Definition ObjectPool.h:200
TObjectPool(int32 InNumPerBlock, int32 InitialBlocks=1)
Definition ObjectPool.h:34
float GetRatio() const
Definition ObjectPool.h:230
TObjectPool & operator=(const TObjectPool &)=delete
void ReserveItems(int32 NumItems)
Definition ObjectPool.h:217
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_FORCEINLINE_HINT void RemoveAtSwap(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2185
Definition SkeletalMeshComponent.h:307
std::enable_if_t<!std::is_trivially_destructible_v< T > > TRequiresDestructor
Definition ObjectPool.h:17
std::enable_if_t< std::is_trivially_destructible_v< T > > TTrivialDestruct
Definition ObjectPool.h:21
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT void MemoryBarrier()
Definition AndroidPlatformMisc.h:249
Definition UnrealMemory.h:94
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
Definition NumericLimits.h:41