UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ChunkSearch.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Core/BlockRange.h"
6#include "CoreMinimal.h"
7#include "Containers/List.h"
8
10#include "BuildPatchSettings.h"
11
12namespace BuildPatchServices
13{
14 namespace ListHelpers
15 {
16 template <typename ElementType>
18 {
19 for (const ElementType& Elem : CopyFrom)
20 {
21 CopyTo.AddTail(Elem);
22 }
23 }
24
25 template <typename ListType, typename NodeType, typename ElementType>
26 FORCEINLINE void InsertBefore(const ElementType& NewNode, ListType& List, NodeType* Node)
27 {
28 List.InsertNode(NewNode, Node);
29 }
30
31 template <typename ListType, typename NodeType, typename ElementType>
32 FORCEINLINE void InsertAfter(const ElementType& NewNode, ListType& List, NodeType* Node)
33 {
34 NodeType* NextNode = Node->GetNextNode();
35 if (NextNode)
36 {
37 List.InsertNode(NewNode, NextNode);
38 }
39 else
40 {
41 List.AddTail(NewNode);
42 }
43 }
44
46 {
47 TArray<FString> BuildFiles;
48 Manifest.GetFileList(BuildFiles);
49 return BuildFiles;
50 }
51
52 FORCEINLINE void ForEach(const FBuildPatchAppManifest& Manifest, const TFunction<void(const FFileManifest&)>& Func)
53 {
54 for (const FString& ManifestFile : GetFileList(Manifest))
55 {
56 Func(*Manifest.GetFileManifest(ManifestFile));
57 }
58 }
59
60 FORCEINLINE void ForEach(const FFileManifestList& FileManifestList, const TFunction<void(const FFileManifest&)>& Func)
61 {
62 for (const FFileManifest& FileManifest : FileManifestList.FileList)
63 {
64 Func(FileManifest);
65 }
66 }
67 }
68
70 {
71 public:
73 {
74 public:
80 FChunkNode(const FChunkNode& CopyFrom)
81 : BuildRange(CopyFrom.BuildRange)
82 , ChunkPart(CopyFrom.ChunkPart)
83 {
84 }
85
86 public:
89 };
91 typedef FChunkDList::TDoubleLinkedListNode FChunkDListNode;
92
93 struct FFileNode
94 {
95 public:
101 FFileNode(const FFileNode& CopyFrom)
102 : Manifest(CopyFrom.Manifest)
103 , BuildRange(CopyFrom.BuildRange)
104 {
106 }
107
108 public:
112 };
114 typedef FFileDList::TDoubleLinkedListNode FFileDListNode;
115
116 template<typename InitType>
117 FChunkSearcher(const InitType& InitClass)
118 {
120 ListHelpers::ForEach(InitClass, [&](const FFileManifest& FileManifest)
121 {
123 for (const FChunkPart& ChunkPart : FileNode.Manifest->ChunkParts)
124 {
126 FileNode.ChunkParts.AddTail(ChunkNode);
127 LocationCount += ChunkPart.Size;
128 }
129 FileLinkedList.AddTail(FileNode);
130 });
131 SetStart();
132 }
133
134 void ForEachOverlap(const FBlockStructure& BlockStructure, const TFunction<void(const FBlockRange&, FFileDListNode*, FChunkDListNode*)>& Handler)
135 {
136 const FBlockEntry* Block = BlockStructure.GetHead();
137 while (Block)
138 {
139 ForEachOverlap(Block->AsRange(), Handler);
140 Block = Block->GetNext();
141 }
142 }
143
145 {
146 if (!CurrFile || !CurrChunk)
147 {
148 SetStart();
149 }
150
151 // Find file to start on.
152 for (FFileDListNode* StartFile = FindFirst(&FileLinkedList, CurrFile, BlockRange); CurrFile != StartFile;)
153 {
154 CurrFile = StartFile;
155 CurrChunk = CurrFile->GetValue().ChunkParts.GetHead();
156 }
157 check(CurrFile->GetValue().BuildRange.Overlaps(BlockRange));
158
159 // Find chunk to start on.
160 CurrChunk = FindFirst(&CurrFile->GetValue().ChunkParts, CurrChunk, BlockRange);
161 check(CurrChunk->GetValue().BuildRange.Overlaps(BlockRange));
162
163 // Will be searching forwards only.
164 while (CurrFile && CurrChunk)
165 {
166 if (CurrFile->GetValue().BuildRange.Overlaps(BlockRange))
167 {
168 if (CurrChunk->GetValue().BuildRange.Overlaps(BlockRange))
169 {
170 FChunkDListNode* NextChunk = CurrChunk->GetNextNode();
171 const FBlockRange OverlapRange = FBlockRange::FromIntersection(CurrChunk->GetValue().BuildRange, BlockRange);
172 Handler(OverlapRange, CurrFile, CurrChunk);
173 // Find next chunk ptr.
174 CurrChunk = NextChunk;
175 while (!CurrChunk && CurrFile)
176 {
177 CurrFile = CurrFile->GetNextNode();
178 if (CurrFile)
179 {
180 CurrChunk = CurrFile->GetValue().ChunkParts.GetHead();
181 }
182 }
183 }
184 // First non-overlap we hit we are finished.
185 else
186 {
187 return;
188 }
189 }
190 // First non-overlap we hit we are finished.
191 else
192 {
193 return;
194 }
195 }
196 }
197
199 {
200 return FileLinkedList.GetHead();
201 }
202
204 {
206 NewFileManifestList.FileList.Reserve(FileLinkedList.Num());
207 for (const FFileNode& FileNode : FileLinkedList)
208 {
209 FFileManifest& FileManifest = NewFileManifestList.FileList.Add_GetRef(*FileNode.Manifest);
210 FileManifest.ChunkParts.Empty(FileNode.ChunkParts.Num());
211 for (const FChunkNode& ChunkNode : FileNode.ChunkParts)
212 {
213 FileManifest.ChunkParts.Add(ChunkNode.ChunkPart);
214 }
215 }
216 return NewFileManifestList;
217 }
218
219 private:
220 void SetStart()
221 {
222 CurrFile = FileLinkedList.GetHead();
223 CurrChunk = CurrFile->GetValue().ChunkParts.GetHead();
224 }
225
226 template<typename ListType, typename ListNodeType>
227 ListNodeType* FindFirst(ListType* List, ListNodeType* Current, const FBlockRange& BlockRange)
228 {
229 // If we need to search backward.
230 if (BlockRange.GetLast() < Current->GetValue().BuildRange.GetFirst())
231 {
232 while (Current && !Current->GetValue().BuildRange.Overlaps(BlockRange))
233 {
234 Current = Current->GetPrevNode();
235 }
236 }
237 // Else we need to search forward.
238 else
239 {
240 while (Current && !Current->GetValue().BuildRange.Overlaps(BlockRange))
241 {
242 Current = Current->GetNextNode();
243 }
244 }
245 // Now we are overlapping, we continue reverse until we find one that doesn't, ignoring empty files too.
246 while (Current && (Current->GetValue().BuildRange.Overlaps(BlockRange) || Current->GetValue().BuildRange.GetSize() == 0))
247 {
248 Current = Current->GetPrevNode();
249 }
250 // If we ended with null, then head is the first.
251 if (!Current)
252 {
253 Current = List->GetHead();
254 }
255 // Otherwise, we then go back to the first that overlaps, which also skips empties.
256 else
257 {
258 while (Current && !Current->GetValue().BuildRange.Overlaps(BlockRange))
259 {
260 Current = Current->GetNextNode();
261 }
262 }
263 return Current;
264 }
265
266 private:
267 FFileDList FileLinkedList;
268 FFileDListNode* CurrFile;
269 FChunkDListNode* CurrChunk;
270 };
271}
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition BlockStructure.h:37
const FBlockEntry * GetHead() const
Definition BlockStructure.cpp:181
Definition ChunkSearch.h:70
void ForEachOverlap(const FBlockStructure &BlockStructure, const TFunction< void(const FBlockRange &, FFileDListNode *, FChunkDListNode *)> &Handler)
Definition ChunkSearch.h:134
FFileDList::TDoubleLinkedListNode FFileDListNode
Definition ChunkSearch.h:114
FChunkDList::TDoubleLinkedListNode FChunkDListNode
Definition ChunkSearch.h:91
FChunkSearcher(const InitType &InitClass)
Definition ChunkSearch.h:117
FFileDListNode * GetHead()
Definition ChunkSearch.h:198
void ForEachOverlap(const FBlockRange &BlockRange, const TFunction< void(const FBlockRange &, FFileDListNode *, FChunkDListNode *)> &Handler)
Definition ChunkSearch.h:144
FFileManifestList BuildNewFileManifestList()
Definition ChunkSearch.h:203
TDoubleLinkedList< FFileNode > FFileDList
Definition ChunkSearch.h:113
TDoubleLinkedList< FChunkNode > FChunkDList
Definition ChunkSearch.h:90
Definition BuildPatchManifest.h:64
virtual const BuildPatchServices::FFileManifest * GetFileManifest(const FString &Filename) const
Definition BuildPatchManifest.cpp:1035
virtual void GetFileList(TArray< FString > &Filenames) const
Definition BuildPatchManifest.cpp:953
Definition Array.h:670
TDoubleLinkedListNode * GetNextNode()
Definition List.h:462
const ElementType & GetValue() const
Definition List.h:452
Definition List.h:439
TDoubleLinkedListNode * GetHead() const
Definition List.h:727
bool AddTail(const ElementType &InElement)
Definition List.h:573
int32 Num() const
Definition List.h:786
Definition AndroidPlatformMisc.h:14
FORCEINLINE void InsertBefore(const ElementType &NewNode, ListType &List, NodeType *Node)
Definition ChunkSearch.h:26
FORCEINLINE void ForEach(const FBuildPatchAppManifest &Manifest, const TFunction< void(const FFileManifest &)> &Func)
Definition ChunkSearch.h:52
FORCEINLINE void InsertAfter(const ElementType &NewNode, ListType &List, NodeType *Node)
Definition ChunkSearch.h:32
FORCEINLINE TArray< FString > GetFileList(const FBuildPatchAppManifest &Manifest)
Definition ChunkSearch.h:45
FORCEINLINE void Copy(const TDoubleLinkedList< ElementType > &CopyFrom, TDoubleLinkedList< ElementType > &CopyTo)
Definition ChunkSearch.h:17
Definition BuildPatchFileConstructor.h:28
@ List
Definition ITypedTableView.h:38
Definition BlockStructure.h:10
Definition BlockRange.h:13
static FBlockRange FromIntersection(const FBlockRange &RangeA, const FBlockRange &RangeB)
Definition BlockRange.h:57
static FBlockRange FromFirstAndSize(uint64 InFirst, uint64 InSize)
Definition BlockRange.h:42
Definition ChunkData.h:188
FBlockRange BuildRange
Definition ChunkSearch.h:87
FChunkNode(const FChunkNode &CopyFrom)
Definition ChunkSearch.h:80
FChunkPart ChunkPart
Definition ChunkSearch.h:88
FChunkNode(const FChunkPart &InChunkPart, const FBlockRange &InBuildRange)
Definition ChunkSearch.h:75
const FFileManifest *const Manifest
Definition ChunkSearch.h:109
FFileNode(const FFileManifest *const InManifest, const FBlockRange &InBuildRange)
Definition ChunkSearch.h:96
FFileNode(const FFileNode &CopyFrom)
Definition ChunkSearch.h:101
const FBlockRange BuildRange
Definition ChunkSearch.h:110
FChunkDList ChunkParts
Definition ChunkSearch.h:111
Definition ManifestData.h:159
TArray< FFileManifest > FileList
Definition ManifestData.h:173
Definition ManifestData.h:140
uint64 FileSize
Definition ManifestData.h:155
TArray< FChunkPart > ChunkParts
Definition ManifestData.h:153