UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
NetChunkedArray.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6
7namespace UE::Net
8{
9
10// Configure what happens when new chunks are allocated.
11enum class EInitMemory : uint8
12{
13 Zero, // Memory will be filled with zeros.
14 Constructor // Memory will be initialized by the elements constructor.
15};
16
21template<typename InElementType, uint32 ElementsPerChunk = 100, typename AllocatorType = FDefaultAllocator>
22class TNetChunkedArray : public TChunkedArray<InElementType, sizeof(InElementType)* ElementsPerChunk, AllocatorType>
23{
24public:
25
26 using Super = TChunkedArray<InElementType, sizeof(InElementType) * ElementsPerChunk, AllocatorType>;
27
29 {
31
32 // Compute the number of chunks needed.
33 const int32 NumChunks = (this->NumElements + this->NumElementsPerChunk - 1) / this->NumElementsPerChunk;
34
35 // Initial blocks should come from a single block of memory.
36 this->Chunks.Empty(NumChunks);
37 typename Super::FChunk* StartChunks = new typename Super::FChunk[NumChunks];
38 for (int32 ChunkIndex = 0; ChunkIndex < NumChunks; ChunkIndex++)
39 {
40 typename Super::FChunk* CurrentChunk = (StartChunks + ChunkIndex);
42 {
43 FMemory::Memset<typename Super::FChunk>(*CurrentChunk, 0);
44 }
45
46 this->Chunks.Add(CurrentChunk);
47 }
48
50 }
51
53 {
54 CopyIncludingPreAllocatedChunks(OtherChunkedArray);
55 }
56
58 {
59 CopyIncludingPreAllocatedChunks(OtherChunkedArray);
60 return *this;
61 }
62
64 {
65 MoveIncludingPreAllocatedChunks(OtherChunkedArray);
66 }
67
69 {
70 if (this != &OtherChunkedArray)
71 {
72 MoveIncludingPreAllocatedChunks(OtherChunkedArray);
73 }
74 return *this;
75 }
76
78 {
79 InvalidatePreAllocatedChunks();
80 }
81
83 {
84 return this->Chunks.Num();
85 }
86
91 {
92 return this->Chunks.Num() * this->NumElementsPerChunk;
93 }
94
95 void Empty(int32 Slack = 0)
96 {
97 checkf(false, TEXT("This function is not supported"));
98 }
99
100 void Reset(int32 NewSize = 0)
101 {
102 checkf(false, TEXT("This function is not supported"));
103 }
104
112 {
113 if (Index >= this->NumElements)
114 {
115 int32 NewElementCount = (Index - this->NumElements) + 1;
116 this->Add(NewElementCount);
117 }
118 }
119
127 {
128 const int32 OldChunkCount = this->Chunks.Num();
130 for (int32 ChunkIndex = OldChunkCount; ChunkIndex < this->Chunks.Num(); ChunkIndex++)
131 {
132 FMemory::Memset<typename Super::FChunk>(*this->Chunks.GetData()[ChunkIndex], 0);
133 }
134 }
135
136protected:
137 /* The number of preallocated chunks. */
139
140private:
148 void InvalidatePreAllocatedChunks()
149 {
150 // Invalid pre-allocated chunks from the chunks array.
151 typename Super::FChunk* FirstChunk = nullptr;
152 for (int32 ChunkIndex = 0; ChunkIndex < NumPreAllocatedChunks; ChunkIndex++)
153 {
154 FirstChunk = (FirstChunk == nullptr) ? this->Chunks.GetData()[ChunkIndex] : FirstChunk;
155 this->Chunks.GetData()[ChunkIndex] = nullptr;
156 }
157
158 // The first chunk points to the beginning of the block of memory used by the pre-allocated chunks.
159 delete[] FirstChunk;
160
162 }
163
168 void CopyIncludingPreAllocatedChunks(const TNetChunkedArray& ChunkedArray)
169 {
170 // Free the memory for any existing pre-allocated chunks.
171 InvalidatePreAllocatedChunks();
172
173 this->NumElements = ChunkedArray.NumElements;
174 this->NumPreAllocatedChunks = ChunkedArray.NumPreAllocatedChunks;
175
176 // Compute the number of chunks to copy and prepare the chunked array.
177 const int32 NumChunks = ChunkedArray.Chunks.Num();
178
179 this->Chunks.Empty(NumChunks);
180
181 // Copy the pre-allocated chunks.
182 typename Super::FChunk* PreAllocatedChunks = new typename Super::FChunk[this->NumPreAllocatedChunks];
183 for (int32 ChunkIndex = 0; ChunkIndex < this->NumPreAllocatedChunks; ChunkIndex++)
184 {
185 typename Super::FChunk* CurrentChunk = (PreAllocatedChunks + ChunkIndex);
186
187 *CurrentChunk = *ChunkedArray.Chunks.GetData()[ChunkIndex];
188
189 this->Chunks.Add(CurrentChunk);
190 }
191
192 // Copy any remaining chunks.
193 for (int32 ChunkIndex = this->NumPreAllocatedChunks; ChunkIndex < NumChunks; ChunkIndex++)
194 {
195 const typename Super::FChunk* CurrentChunk = ChunkedArray.Chunks.GetData()[ChunkIndex];
196
197 this->Chunks.Add(new typename Super::FChunk(*CurrentChunk));
198 }
199 }
200
201 void MoveIncludingPreAllocatedChunks(TNetChunkedArray& ChunkedArray)
202 {
203 this->Chunks = (typename Super::ChunksType&&)ChunkedArray.Chunks;
204 this->NumElements = ChunkedArray.NumElements;
205 this->NumPreAllocatedChunks = ChunkedArray.NumPreAllocatedChunks;
206
207 ChunkedArray.NumElements = 0;
208 ChunkedArray.NumPreAllocatedChunks = 0;
209 }
210};
211
212}
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition ChunkedArray.h:56
ChunksType Chunks
Definition ChunkedArray.h:338
int32 NumElements
Definition ChunkedArray.h:341
TIndirectArray< FChunk, AllocatorType > ChunksType
Definition ChunkedArray.h:337
@ NumElementsPerChunk
Definition ChunkedArray.h:327
UE_FORCEINLINE_HINT int32 Num() const
Definition IndirectArray.h:94
UE_FORCEINLINE_HINT int32 Add(T *Item)
Definition IndirectArray.h:374
void Empty(int32 Slack=0)
Definition IndirectArray.h:361
UE_FORCEINLINE_HINT T ** GetData()
Definition IndirectArray.h:104
Definition NetChunkedArray.h:23
int32 NumPreAllocatedChunks
Definition NetChunkedArray.h:138
void Reset(int32 NewSize=0)
Definition NetChunkedArray.h:100
int32 Capacity() const
Definition NetChunkedArray.h:90
TNetChunkedArray & operator=(TNetChunkedArray &&OtherChunkedArray)
Definition NetChunkedArray.h:68
TNetChunkedArray & operator=(const TNetChunkedArray &OtherChunkedArray)
Definition NetChunkedArray.h:57
TNetChunkedArray(int32 InNumElements=0, EInitMemory InitMemory=EInitMemory::Constructor)
Definition NetChunkedArray.h:28
~TNetChunkedArray()
Definition NetChunkedArray.h:77
TNetChunkedArray(TNetChunkedArray &&OtherChunkedArray)
Definition NetChunkedArray.h:63
void AddToIndexUninitialized(int32 Index)
Definition NetChunkedArray.h:111
void AddToIndexZeroed(int32 Index)
Definition NetChunkedArray.h:126
void Empty(int32 Slack=0)
Definition NetChunkedArray.h:95
int32 NumChunks() const
Definition NetChunkedArray.h:82
TNetChunkedArray(const TNetChunkedArray &OtherChunkedArray)
Definition NetChunkedArray.h:52
Definition NetworkVersion.cpp:28
EInitMemory
Definition NetChunkedArray.h:12
U16 Index
Definition radfft.cpp:71
Definition ChunkedArray.h:331