25template <
typename Type,
int32 BlockSize = 512>
28 static_assert(BlockSize > 0,
"TDynamicVector: BlockSize must be larger than zero.");
29 static_assert(((BlockSize & (BlockSize - 1)) == 0),
"TDynamicVector: BlockSize must be a power of two.");
32 return N <= 1 ? 0 : 1 + NumBitsNeeded((N + 1) / 2);
56 : CurBlock(
Copy.CurBlock)
57 , CurBlockUsed(
Copy.CurBlockUsed)
61 for (
int32 k = 0; k < N; ++k)
63 Blocks.
Add(
new TBlock(*
Copy.Blocks[k]));
68 : CurBlock(
Moved.CurBlock)
69 , CurBlockUsed(
Moved.CurBlockUsed)
73 Moved.CurBlockUsed = 0;
74 Moved.AddAllocatedBlock();
83 CurBlock =
Copy.CurBlock;
84 CurBlockUsed =
Copy.CurBlockUsed;
85 for (
int32 k = 0; k < N; ++k)
87 Blocks.
Add(
new TBlock(*
Copy.Blocks[k]));
99 CurBlock =
Moved.CurBlock;
100 CurBlockUsed =
Moved.CurBlockUsed;
104 Moved.CurBlockUsed = 0;
105 Moved.AddAllocatedBlock();
114 const Type* ArrayPtr =
Array.GetData();
115 for (
uint32 Idx = 0; Idx < N; ++Idx)
117 (*this)[Idx] = ArrayPtr[Idx];
125 const Type* ArrayPtr =
Array.GetData();
126 for (
uint32 Idx = 0; Idx < N; ++Idx)
128 (*this)[Idx] = ArrayPtr[Idx];
145 inline bool IsEmpty()
const {
return CurBlock == 0 && CurBlockUsed == 0; }
146 inline size_t GetLength()
const {
return CurBlock * BlockSize + CurBlockUsed; }
149 inline size_t GetByteCount()
const {
return Blocks.
Num() * BlockSize *
sizeof(Type); }
151 inline void Add(
const Type& Data);
158 inline void InsertAt(
const Type& Data,
unsigned int Index,
const Type& InitValue);
164 return GetElement(0, 0);
167 inline const Type&
Back()
const
170 return GetElement(CurBlock, CurBlockUsed - 1);
173#if USING_ADDRESS_SANITISER
179 return GetElement(GetBlockIndex(
Index), GetIndexInBlock(
Index));
182#if USING_ADDRESS_SANITISER
191 template <
typename Func>
213 template <
bool bForceBulkSerialization = false,
bool bUseCompression = false>
224 return (*DVector)[Idx];
228 return (*DVector)[Idx];
243 return DVector ==
Itr2.DVector && Idx ==
Itr2.Idx;
247 return DVector !=
Itr2.DVector || Idx !=
Itr2.Idx;
277 return (*DVector)[Idx];
292 return DVector ==
Itr2.DVector && Idx ==
Itr2.Idx;
296 return DVector !=
Itr2.DVector || Idx !=
Itr2.Idx;
321 Type Elements[BlockSize];
324 unsigned int CurBlock{0};
325 unsigned int CurBlockUsed{0};
329 void AddAllocatedBlock()
331 Blocks.
Add(
new TBlock);
336 for (
int32 k = 0, N = Blocks.
Num(); k < N; ++k)
369 template <
int32 BlockSizeRhs>
372 if (Lhs.
Num() != Rhs.Num())
408 template <
int32 BlockSizeRhs>
411 return !(Lhs == Rhs);
425template <
class Type,
int N>
445 Data.Resize(
Count * N);
449 Data.Resize(
Count * N, InitValue);
453 return Data.IsEmpty();
457 return Data.GetLength() / N;
461 return Data.GetBlockSize();
465 return Data.GetByteCount();
477 for (
int i = 0; i < N; i++)
479 Data.Add(AddData.
Data[i]);
485 for (
int i = 0; i < N; i++)
493 for (
int i = 1; i <= N; i++)
495 Data.InsertAt(AddData.
Data[N - i], N * (
Index + 1) - i);
501 return Data[TopIndex * N +
SubIndex];
505 return Data[TopIndex * N +
SubIndex];
510 unsigned int i = TopIndex * N;
517 unsigned int i = TopIndex * N;
526 Data[TopIndex * N + 0],
527 Data[TopIndex * N + 1]);
533 Data[TopIndex * N + 0],
534 Data[TopIndex * N + 1],
535 Data[TopIndex * N + 2]);
541 (
int)Data[TopIndex * N + 0],
542 (
int)Data[TopIndex * N + 1]);
548 (
int)Data[TopIndex * N + 0],
549 (
int)Data[TopIndex * N + 1],
550 (
int)Data[TopIndex * N + 2]);
556 (
int)Data[TopIndex * N + 0],
557 (
int)Data[TopIndex * N + 1],
558 (
int)Data[TopIndex * N + 2],
559 (
int)Data[TopIndex * N + 3]);
577template <
typename Type,
int32 BlockSize>
583 if (Blocks.
Num() == 0)
589template <
typename Type,
int32 BlockSize>
602template <
typename Type,
int32 BlockSize>
605 if (GetLength() ==
Count)
634template <
typename Type,
int32 BlockSize>
641 (*this)[
Index] = InitValue;
645template <
typename Type,
int32 BlockSize>
656 (*this)[
Index] = InitValue;
661template <
typename Type,
int32 BlockSize>
665 if (CurBlockUsed == BlockSize)
667 if (CurBlock == Blocks.
Num() - 1)
674 GetElement(CurBlock, CurBlockUsed) = Data;
678template <
typename Type,
int32 BlockSize>
679template <
int32 BlockSizeData>
688 (*this)[
Offset + DataIndex] = Data[DataIndex];
692template <
typename Type,
int32 BlockSize>
700 (*this)[
Offset + DataIndex] = Data[DataIndex];
704template <
typename Type,
int32 BlockSize>
712 (*this)[
Offset + DataIndex] = Data[DataIndex];
716template <
typename Type,
int32 BlockSize>
719 if (CurBlockUsed > 0)
723 if (CurBlockUsed == 0 && CurBlock > 0)
726 CurBlockUsed = BlockSize;
730template <
typename Type,
int32 BlockSize>
733 size_t s = GetLength();
743 return (*
this)[
Index];
746template <
typename Type,
int32 BlockSize>
749 size_t s = GetLength();
761 (*this)[
Index] = Data;
765template <
typename Type,
int32 BlockSize>
769 InsertAt(AddData,
Index);
771 for (
unsigned int i = (
unsigned int)
nCurSize; i <
Index; ++i)
773 (*this)[i] = InitValue;
777template <
typename Type,
int32 BlockSize>
778template <
typename Func>
784 const int32 NumElements =
BlockIndex < CurBlock ? BlockSize : CurBlockUsed;
785 for (
int32 ElementIndex = 0; ElementIndex < NumElements; ++ElementIndex)
792template <
typename Type,
int32 BlockSize>
793template <
bool bForceBulkSerialization,
bool bUseCompression>
817 std::is_same_v<Type, FVector2d> ||
818 std::is_same_v<Type, FVector3d> ||
819 std::is_same_v<Type, FVector4d> ||
820 std::is_same_v<Type, FQuat4d> ||
821 std::is_same_v<Type, FTransform3d>;
876 static_assert(!bUseCompression ||
bUseBulkSerialization,
"Compression only available when using bulk serialization");
893 Type* BufferPtr =
Buffer.GetData();
902 BufferPtr += BlockSize;
914 TBlock *
const NewBlock =
new TBlock;
918 BufferPtr += BlockSize;
945 TBlock *
const NewBlock =
new TBlock;
EAllowShrinking
Definition AllowShrinking.h:10
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
@ COMPRESS_NoFlags
Definition CompressionFlags.h:28
FORCEINLINE bool CompareItems(const ElementType *A, const ElementType *B, SizeType Count)
Definition MemoryOps.h:287
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define MAX_uint32
Definition NumericLimits.h:21
@ LARGE_WORLD_COORDINATES
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Offset
Definition VulkanMemory.cpp:4033
int BlockIndex
Definition binka_ue_decode_test.cpp:38
Definition Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
virtual CORE_API void UsingCustomVersion(const struct FGuid &Guid)
Definition Archive.cpp:590
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
CORE_API int32 CustomVer(const struct FGuid &Key) const
Definition Archive.cpp:602
CORE_API void SerializeCompressedNew(void *V, int64 Length, FName CompressionFormatToEncode, FName CompressionFormatToDecodeOldV1Files, ECompressionFlags Flags=COMPRESS_NoFlags, bool bTreatBufferAsFileReader=false, int64 *OutPartialReadLength=nullptr)
Definition Archive.cpp:740
virtual void CountBytes(SIZE_T InNum, SIZE_T InMax)
Definition Archive.h:125
UE_FORCEINLINE_HINT FPackageFileVersion UEVer() const
Definition Archive.h:204
Definition ArrayView.h:139
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void RemoveAt(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2083
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
void SetNumUninitialized(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2369
void Empty(SizeType Slack=0)
Definition Array.h:2273
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition DynamicVector.h:427
TVector2< Type > AsVector2(unsigned int TopIndex) const
Definition DynamicVector.h:522
size_t GetByteCount() const
Definition DynamicVector.h:463
friend class FIterator
Definition DynamicVector.h:565
int GetBlockSize() const
Definition DynamicVector.h:459
FIndex3i AsIndex3(unsigned int TopIndex) const
Definition DynamicVector.h:544
bool IsEmpty() const
Definition DynamicVector.h:451
TDynamicVectorN & operator=(TDynamicVectorN &&Moved)=default
void Fill(const Type &Value)
Definition DynamicVector.h:439
TDynamicVectorN(TDynamicVectorN &&Moved)=default
TDynamicVectorN(const TDynamicVectorN &Copy)=default
void SetVector2(unsigned int TopIndex, const TVector2< Type > &V)
Definition DynamicVector.h:507
TVector< Type > AsVector3(unsigned int TopIndex) const
Definition DynamicVector.h:529
void SetVector3(unsigned int TopIndex, const TVector< Type > &V)
Definition DynamicVector.h:514
FIndex4i AsIndex4(unsigned int TopIndex) const
Definition DynamicVector.h:552
void PopBack()
Definition DynamicVector.h:483
void InsertAt(const ElementVectorN &AddData, unsigned int Index)
Definition DynamicVector.h:491
const Type & operator()(unsigned int TopIndex, unsigned int SubIndex) const
Definition DynamicVector.h:503
TDynamicVectorN()=default
TDynamicVectorN & operator=(const TDynamicVectorN &Copy)=default
Type & operator()(unsigned int TopIndex, unsigned int SubIndex)
Definition DynamicVector.h:499
void Add(const ElementVectorN &AddData)
Definition DynamicVector.h:474
void Resize(unsigned int Count)
Definition DynamicVector.h:443
FIndex2i AsIndex2(unsigned int TopIndex) const
Definition DynamicVector.h:537
size_t GetLength() const
Definition DynamicVector.h:455
void Clear()
Definition DynamicVector.h:435
void Resize(unsigned int Count, const Type &InitValue)
Definition DynamicVector.h:447
Definition DynamicVector.h:273
FConstIterator operator++(int)
Definition DynamicVector.h:284
const Type & operator*() const
Definition DynamicVector.h:275
bool operator==(const FConstIterator &Itr2) const
Definition DynamicVector.h:290
bool operator!=(const FConstIterator &Itr2) const
Definition DynamicVector.h:294
FConstIterator & operator++()
Definition DynamicVector.h:279
Definition DynamicVector.h:220
FIterator & operator++()
Definition DynamicVector.h:230
FIterator operator++(int)
Definition DynamicVector.h:235
bool operator!=(const FIterator &Itr2) const
Definition DynamicVector.h:245
bool operator==(const FIterator &Itr2) const
Definition DynamicVector.h:241
const Type & operator*() const
Definition DynamicVector.h:222
Type & operator*()
Definition DynamicVector.h:226
Definition DynamicVector.h:27
void InsertAt(const Type &Data, unsigned int Index, const Type &InitValue)
Definition DynamicVector.h:766
const Type & Front() const
Definition DynamicVector.h:161
TDynamicVector(TDynamicVector &&Moved)
Definition DynamicVector.h:67
size_t GetByteCount() const
Definition DynamicVector.h:149
void Add(const Type &Data)
Definition DynamicVector.h:662
const Type & Back() const
Definition DynamicVector.h:167
Type & ElementAt(unsigned int Index, Type InitialValue=Type{})
Definition DynamicVector.h:731
void InsertAt(const Type &Data, unsigned int Index)
Definition DynamicVector.h:747
TDynamicVector & operator=(const TDynamicVector &Copy)
Definition DynamicVector.h:77
bool SetMinimumSize(unsigned int Count, const Type &InitValue)
Resize if Num() is less than Count; returns true if resize occurred.
Definition DynamicVector.h:646
void PopBack()
Definition DynamicVector.h:717
void Add(TArrayView< const Type > Data)
Definition DynamicVector.h:705
TDynamicVector & operator=(TDynamicVector &&Moved)
Definition DynamicVector.h:93
friend FArchive & operator<<(FArchive &Ar, TDynamicVector &Vec)
Definition DynamicVector.h:201
TDynamicVector(const TArray< Type > &Array)
Definition DynamicVector.h:110
void Serialize(FArchive &Ar)
Definition DynamicVector.h:794
Type & operator[](uint32 Index)
Definition DynamicVector.h:185
size_t Num() const
Definition DynamicVector.h:147
TDynamicVector(const TDynamicVector &Copy)
Definition DynamicVector.h:55
void Clear()
Definition DynamicVector.h:578
FIterator end()
Definition DynamicVector.h:264
void Resize(unsigned int Count, const Type &InitValue)
Definition DynamicVector.h:635
friend bool operator==(const TDynamicVector &Lhs, const TDynamicVector< Type, BlockSizeRhs > &Rhs)
Definition DynamicVector.h:370
Type ElementType
Definition DynamicVector.h:48
TDynamicVector(TArrayView< const Type > Array)
Definition DynamicVector.h:121
FConstIterator begin() const
Definition DynamicVector.h:308
friend bool operator!=(const TDynamicVector &Lhs, const TDynamicVector< Type, BlockSizeRhs > &Rhs)
Definition DynamicVector.h:409
void Resize(unsigned int Count)
Definition DynamicVector.h:603
FConstIterator end() const
Definition DynamicVector.h:313
static constexpr int32 GetBlockSize()
Definition DynamicVector.h:148
void Apply(const Func &ApplyFunc)
Definition DynamicVector.h:779
FIterator begin()
Definition DynamicVector.h:259
~TDynamicVector()
Definition DynamicVector.h:132
bool IsEmpty() const
Definition DynamicVector.h:145
TDynamicVector()
Definition DynamicVector.h:50
size_t GetLength() const
Definition DynamicVector.h:146
void Fill(const Type &Value)
Definition DynamicVector.h:590
void Add(const TDynamicVector< Type, BlockSizeData > &Data)
Definition DynamicVector.h:680
void SetNum(unsigned int Count)
Definition DynamicVector.h:143
const Type & operator[](uint32 Index) const
Definition DynamicVector.h:176
void Add(const TArray< Type > &Data)
Definition DynamicVector.h:693
Type
Definition PawnAction_Move.h:11
Definition AdvancedWidgetsModule.cpp:13
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
CORE_API static const FGuid GUID
Definition UE5MainStreamObjectVersion.h:22
Definition IndexTypes.h:27
Definition IndexTypes.h:158
Definition IndexTypes.h:296
Definition DynamicVector.h:470
Type Data[N]
Definition DynamicVector.h:471
T Y
Definition Vector2D.h:52
T X
Definition Vector2D.h:49
T Z
Definition Vector.h:68
T Y
Definition Vector.h:65
T X
Definition Vector.h:62