UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
BlockData.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Containers/Array.h"
5#include "Templates/Tuple.h"
6#include "Core/BlockRange.h"
8
9namespace BuildPatchServices
10{
11 template<typename ElementType>
13 {
14 private:
15 struct FBlockToCopy
16 {
17 public:
18 uint64 SortOffset;
19 FBlockRange CopyBlockRange;
20 const ElementType* DataPtr;
21 };
22
23 public:
24
26 {
27 return Data.Num();
28 }
29
31 {
32 return Data.GetAllocatedSize();
33 }
34
35 void CopyTo(TArray<ElementType>& OutData, const FBlockStructure& Structure) const
36 {
37 // Fully intersects!
38 check(BlockStructureHelpers::CountSize(DataStructure.Intersect(Structure)) == BlockStructureHelpers::CountSize(Structure));
39
40 // Add data for each piece of the provided structure.
41 const FBlockStructure LocalSpaceStructure = BlockStructureHelpers::SerializeIntersection(DataStructure, Structure);
43 while (LocalSpaceBlock != nullptr)
44 {
45 OutData.Append(Data.GetData() + LocalSpaceBlock->GetOffset(), LocalSpaceBlock->GetSize());
47 }
48 }
49
51 {
52 AddData(NewStructure, NewData.GetData(), NewData.Num());
53 }
54
55 void AddData(const FBlockStructure& NewStructure, const ElementType* NewData, const int32 NewDataCount)
56 {
57 // No intersections!
58 check(BlockStructureHelpers::CountSize(DataStructure.Intersect(NewStructure)) == 0);
59 // Correct input
60 check(BlockStructureHelpers::CountSize(NewStructure) == NewDataCount);
61
62 // Construct the new array.
63 const uint64 NewStructureFirst = NewStructure.GetHead()->GetOffset();
64 const uint64 ThisStructureLast = DataStructure.GetTail() == nullptr ? 0 : DataStructure.GetTail()->GetOffset();
66 if (bAppendOnly)
67 {
68 Data.Append(NewData, NewDataCount);
69 }
70 else
71 {
75 const FBlockEntry* Block = DataStructure.GetHead();
76 uint64 FirstByte = 0;
77 while (Block != nullptr)
78 {
79 BlocksToCopy.Add(FBlockToCopy{Block->GetOffset(), FBlockRange::FromFirstAndSize(FirstByte, Block->GetSize()), Data.GetData()});
80 FirstByte += Block->GetSize();
81 Block = Block->GetNext();
82 }
83 Block = NewStructure.GetHead();
84 FirstByte = 0;
85 while (Block != nullptr)
86 {
87 BlocksToCopy.Add(FBlockToCopy{Block->GetOffset(), FBlockRange::FromFirstAndSize(FirstByte, Block->GetSize()), NewData});
88 FirstByte += Block->GetSize();
89 Block = Block->GetNext();
90 }
91 Algo::SortBy(BlocksToCopy, [] (const FBlockToCopy& BlockToCopy) { return BlockToCopy.SortOffset; });
92 for (const FBlockToCopy& BlockToCopy : BlocksToCopy)
93 {
94 CombinedData.Append(BlockToCopy.DataPtr + BlockToCopy.CopyBlockRange.GetFirst(), BlockToCopy.CopyBlockRange.GetSize());
95 }
96 Data = MoveTemp(CombinedData);
97 }
98 DataStructure.Add(NewStructure);
99 }
100
101 void RemoveData(const FBlockStructure& Structure)
102 {
103 const FBlockStructure LocalSpaceStructure = BlockStructureHelpers::SerializeIntersection(DataStructure, Structure);
104
105 {
106 const uint64 StructureSize = BlockStructureHelpers::CountSize(Structure);
107 const uint64 DataStructureSize = BlockStructureHelpers::CountSize(DataStructure);
108 const uint64 LocalSpaceStructureSize = BlockStructureHelpers::CountSize(LocalSpaceStructure);
109 const uint64 IntersectSize = BlockStructureHelpers::CountSize(DataStructure.Intersect(Structure));
112 check(DataStructureSize == Data.Num());
113 }
114
115 // Remove from data buffer each piece of the provided structure.
117 while (LocalSpaceBlock != nullptr)
118 {
119 Data.RemoveAt(LocalSpaceBlock->GetOffset(), LocalSpaceBlock->GetSize(), EAllowShrinking::No);
120 LocalSpaceBlock = LocalSpaceBlock->GetPrevious();
121 }
122 DataStructure.Remove(Structure);
123 }
124
125 private:
126 FBlockStructure DataStructure;
128 };
129}
#define check(expr)
Definition AssertionMacros.h:314
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
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
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition BlockStructure.h:37
void Add(uint64 Offset, uint64 Size, ESearchDir::Type SearchDir=ESearchDir::FromStart)
Definition BlockStructure.cpp:202
void Remove(uint64 Offset, uint64 Size, ESearchDir::Type SearchDir=ESearchDir::FromStart)
Definition BlockStructure.cpp:293
const FBlockEntry * GetHead() const
Definition BlockStructure.cpp:181
FBlockStructure Intersect(const FBlockStructure &OtherStructure) const
Definition BlockStructure.cpp:374
const FBlockEntry * GetTail() const
Definition BlockStructure.cpp:186
Definition Array.h:670
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 Append(const TArray< OtherElementType, OtherAllocatorType > &Source)
Definition Array.h:2412
UE_NODEBUG UE_FORCEINLINE_HINT SIZE_T GetAllocatedSize(void) const
Definition Array.h:1059
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
UE_REWRITE void SortBy(RangeType &&Range, ProjectionType Proj)
Definition Sort.h:40
Definition BuildPatchFileConstructor.h:28
Definition BlockStructure.h:10
uint64 GetOffset() const
Definition BlockStructure.cpp:113
uint64 GetSize() const
Definition BlockStructure.cpp:118
Definition BlockRange.h:13
static FBlockRange FromFirstAndSize(uint64 InFirst, uint64 InSize)
Definition BlockRange.h:42
Definition BlockData.h:13
void AddData(const FBlockStructure &NewStructure, const TArray< ElementType > &NewData)
Definition BlockData.h:50
uint32 GetAllocatedSize() const
Definition BlockData.h:30
void RemoveData(const FBlockStructure &Structure)
Definition BlockData.h:101
int32 GetDataCount() const
Definition BlockData.h:25
void AddData(const FBlockStructure &NewStructure, const ElementType *NewData, const int32 NewDataCount)
Definition BlockData.h:55
void CopyTo(TArray< ElementType > &OutData, const FBlockStructure &Structure) const
Definition BlockData.h:35