UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
BasicArray.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5// HEADER_UNIT_SKIP - Not used?
6
9
10#if _MSC_VER
11 #pragma warning(push)
12 #pragma warning(disable : 4200)
13#endif
14
20template <typename T>
22{
23public:
25 : Data(nullptr)
26 {
27 }
28
29 // Non-copyable for now, but this could be made copyable in future if needed.
30 TBasicArray(const TBasicArray&) = delete;
32
34 : Data(Other.Data)
35 {
36 Other.Data = nullptr;
37 }
38
40 {
42
43 FData* TempData = Temp.Data;
44 Temp.Data = this->Data;
45 this->Data = TempData;
46
47 return *this;
48 }
49
51 {
52 if (FData* LocalData = this->Data)
53 {
56 }
57 }
58
59 template <typename... ArgTypes>
61 {
62 int32 Result = Num();
63
64 void* LocationToAdd = InsertUninitialized(Result);
65 ::new (LocationToAdd) T(Forward<ArgTypes>(Args)...);
66
67 return Result;
68 }
69
70 template <typename... ArgTypes>
71 void EmplaceAt(int32 Index, ArgTypes&&... Args)
72 {
73 void* LocationToAdd = InsertUninitialized(Index);
74 ::new (LocationToAdd) T(Forward<ArgTypes>(Args)...);
75 }
76
90
91 [[nodiscard]] bool IsEmpty() const
92 {
93 return Num() == 0;
94 }
95
96 [[nodiscard]] int32 Num() const
97 {
98 FData* LocalData = Data;
99 return LocalData ? LocalData->Num : 0;
100 }
101
103 {
104 FData* LocalData = Data;
105 return LocalData ? &LocalData->Data[0] : nullptr;
106 }
107
109 {
110 return const_cast<TBasicArray*>(this)->GetData();
111 }
112
114 {
115 return GetData()[Index];
116 }
117
119 {
120 return GetData()[Index];
121 }
122
123private:
124 static constexpr int32 InitialReservationSize = 16;
125
126 static UE_FORCEINLINE_HINT int32 ApplyGrowthFactor(int32 CurrentNum)
127 {
128 return CurrentNum + CurrentNum / 2;
129 }
130
131 void* InsertUninitialized(int32 IndexToAdd)
132 {
133 FData* LocalData = this->Data;
134 T* LocationToAdd = nullptr;
135 if (!LocalData)
136 {
137 // IndexToAdd *must* be 0 here - can't assert that though
138
139 LocalData = (FData*)FMemory::Malloc(sizeof(FData) + InitialReservationSize * sizeof(T));
140 LocalData->Num = 1;
141 LocalData->Max = InitialReservationSize;
142 Data = LocalData;
143 LocationToAdd = LocalData->Data;
144 }
145 else
146 {
147 int32 LocalNum = LocalData->Num;
148 int32 LocalMax = LocalData->Max;
149
150 if (LocalNum == LocalMax)
151 {
152 LocalMax = ApplyGrowthFactor(LocalMax);
153 LocalData = (FData*)FMemory::Realloc(LocalData, sizeof(FData) + LocalMax * sizeof(T));
154 LocalData->Max = LocalMax;
155 this->Data = LocalData;
156 }
159 ++LocalData->Num;
160 }
161
162 return LocationToAdd;
163 }
164
165 struct FData
166 {
167 int32 Num;
168 int32 Max;
169 T Data[0];
170 };
171
172 FData* Data;
173
174 [[nodiscard]] friend T* begin( TBasicArray& Arr) { return Arr.GetData(); }
175 [[nodiscard]] friend const T* begin(const TBasicArray& Arr) { return Arr.GetData(); }
176 [[nodiscard]] friend T* end ( TBasicArray& Arr) { return Arr.GetData() + Arr.Num(); }
177 [[nodiscard]] friend const T* end (const TBasicArray& Arr) { return Arr.GetData() + Arr.Num(); }
178};
179
180template <typename T>
182{
183 enum { Value = true };
184};
185
186#if _MSC_VER
187 #pragma warning(pop)
188#endif
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
FORCEINLINE constexpr void DestructItems(ElementType *Element, SizeType Count)
Definition MemoryOps.h:81
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ Num
Definition MetalRHIPrivate.h:234
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition BasicArray.h:22
friend const T * end(const TBasicArray &Arr)
Definition BasicArray.h:177
UE_FORCEINLINE_HINT T & operator[](int32 Index)
Definition BasicArray.h:113
friend T * begin(TBasicArray &Arr)
Definition BasicArray.h:174
TBasicArray(const TBasicArray &)=delete
friend const T * begin(const TBasicArray &Arr)
Definition BasicArray.h:175
TBasicArray()
Definition BasicArray.h:24
void RemoveAt(int32 Index, int32 NumToRemove=1)
Definition BasicArray.h:77
UE_FORCEINLINE_HINT const T & operator[](int32 Index) const
Definition BasicArray.h:118
T * GetData()
Definition BasicArray.h:102
UE_FORCEINLINE_HINT const T * GetData() const
Definition BasicArray.h:108
friend T * end(TBasicArray &Arr)
Definition BasicArray.h:176
int32 Num() const
Definition BasicArray.h:96
bool IsEmpty() const
Definition BasicArray.h:91
void EmplaceAt(int32 Index, ArgTypes &&... Args)
Definition BasicArray.h:71
TBasicArray(TBasicArray &&Other)
Definition BasicArray.h:33
TBasicArray & operator=(const TBasicArray &)=delete
TBasicArray & operator=(TBasicArray &&Other)
Definition BasicArray.h:39
int32 Emplace(ArgTypes &&... Args)
Definition BasicArray.h:60
~TBasicArray()
Definition BasicArray.h:50
GeometryCollection::Facades::FMuscleActivationData Data
Definition MuscleActivationConstraints.h:15
@ Max
Definition PhysicsPublic.h:130
U16 Index
Definition radfft.cpp:71
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
Definition IsContiguousContainer.h:16
static constexpr bool Value
Definition IsContiguousContainer.h:20