UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TransArray.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
7#include "HAL/UnrealMemory.h"
9#include "Containers/Array.h"
10#include "Misc/ITransaction.h"
11
12
14
15/*-----------------------------------------------------------------------------
16 Transactional array.
17-----------------------------------------------------------------------------*/
18
19// NOTE: Right now, you can't use a custom allocation policy with transactional arrays. If
20// you need to do it, you will have to fix up FTransaction::FObjectRecord to use the correct TArray<Allocator>.
21template< typename T >
23 : public TArray<T>
24{
25public:
26
28
29 // Constructors.
31 : Owner( InOwner )
32 {
34 }
35
37 : Super( Other )
38 , Owner( InOwner )
39 {
41 }
42
44 [[nodiscard]] TTransArray(const TTransArray&) = default;
46 TTransArray& operator=(const TTransArray&) = default;
47
48 // Add, Insert, Remove, Empty interface.
50 {
52 if( GUndo )
53 {
55 }
56 return Index;
57 }
58
60 {
62 if( GUndo )
63 {
65 }
66 }
67
69 {
70 if( GUndo )
71 {
73 }
75 }
76
77 void Empty( int32 Slack=0 )
78 {
79 if( GUndo )
80 {
81 GUndo->SaveArray( Owner, (FScriptArray*)this, 0, this->ArrayNum, -1, sizeof(T), alignof(T), DefaultConstructItem, SerializeItem, DestructItem );
82 }
83 Super::Empty( Slack );
84 }
85
86 // Functions dependent on Add, Remove.
88 {
89 (Super&)*this = Other;
90 }
91
92 // Functions dependent on Add, Remove.
94 {
95 (Super&)*this = MoveTemp(Other);
96 }
97
98 int32 Add( const T& Item )
99 {
100 new(*this) T(Item);
101 return this->Num() - 1;
102 }
103
105 {
106 const int32 Index = AddUninitialized(n);
107 FMemory::Memzero(this->GetData() + Index, n*sizeof(T));
108 return Index;
109 }
110
111 int32 AddUnique( const T& Item )
112 {
113 for( int32 Index=0; Index<this->ArrayNum; Index++ )
114 {
115 if( (*this)[Index]==Item )
116 {
117 return Index;
118 }
119 }
120 return Add( Item );
121 }
122
123 int32 Remove( const T& Item )
124 {
125 this->CheckAddress(&Item);
126
127 const int32 OriginalNum=this->ArrayNum;
128 for( int32 Index=0; Index<this->ArrayNum; Index++ )
129 {
130 if( (*this)[Index]==Item )
131 {
132 RemoveAt( Index-- );
133 }
134 }
135 return OriginalNum - this->ArrayNum;
136 }
137
138 // TTransArray interface.
140 {
141 return Owner;
142 }
143
145 {
146 Owner = NewOwner;
147 }
148
150 {
151 if( GUndo )
152 {
153 GUndo->SaveArray( Owner, (FScriptArray*)this, Index, 1, 0, sizeof(T), alignof(T), DefaultConstructItem, SerializeItem, DestructItem );
154 }
155 }
156
158 {
159 if( GUndo )
160 {
161 GUndo->SaveArray( Owner, (FScriptArray*)this, 0, this->Num(), 0, sizeof(T), alignof(T), DefaultConstructItem, SerializeItem, DestructItem );
162 }
163 }
164
166 {
167 Ar << A.Owner;
168 Ar << (Super&)A;
169 return Ar;
170 }
171
172protected:
173
174 static void DefaultConstructItem( void* TPtr )
175 {
176 ::new (TPtr) T;
177 }
178 static void SerializeItem( FArchive& Ar, void* TPtr )
179 {
180 Ar << *(T*)TPtr;
181 }
182 static void DestructItem( void* TPtr )
183 {
184 ((T*)TPtr)->~T();
185 }
187};
188
189
190
191//
192// Transactional array operator news.
193//
194template <typename T> void* operator new( size_t Size, TTransArray<T>& Array )
195{
196 check(Size == sizeof(T));
197 const int32 Index = Array.AddUninitialized();
198 return &Array[Index];
199}
200
201
202template <typename T> void* operator new( size_t Size, TTransArray<T>& Array, int32 Index )
203{
204 check(Size == sizeof(T));
205 Array.Insert(Index);
206 return &Array[Index];
207}
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
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
CORE_API ITransaction * GUndo
Definition CoreGlobals.cpp:55
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Size
Definition VulkanMemory.cpp:4034
Definition Archive.h:1208
Definition ScriptArray.h:328
Definition ITransaction.h:87
virtual void SaveArray(UObject *Object, class FScriptArray *Array, int32 Index, int32 Count, int32 Oper, int32 ElementSize, uint32 ElementAlignment, STRUCT_DC DefaultConstructor, STRUCT_AR Serializer, STRUCT_DTOR Destructor)=0
Definition Array.h:670
UE_FORCEINLINE_HINT SizeType AddUninitialized()
Definition Array.h:1664
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT void InsertUninitialized(SizeType Index)
Definition Array.h:1782
void RemoveAt(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2083
UE_FORCEINLINE_HINT void CheckAddress(const ElementType *Addr) const
Definition Array.h:1955
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
SizeType ArrayNum
Definition Array.h:3575
void Empty(SizeType Slack=0)
Definition Array.h:2273
Definition TransArray.h:24
static void SerializeItem(FArchive &Ar, void *TPtr)
Definition TransArray.h:178
TTransArray & operator=(const TTransArray &)=default
UObject * Owner
Definition TransArray.h:186
int32 AddUnique(const T &Item)
Definition TransArray.h:111
static void DestructItem(void *TPtr)
Definition TransArray.h:182
void ModifyAllItems()
Definition TransArray.h:157
int32 Add(const T &Item)
Definition TransArray.h:98
int32 AddZeroed(int32 n=1)
Definition TransArray.h:104
TTransArray(UObject *InOwner)
Definition TransArray.h:30
TTransArray(TTransArray &&)=default
TTransArray(const TTransArray &)=default
TTransArray(UObject *InOwner, const Super &Other)
Definition TransArray.h:36
void InsertUninitialized(int32 Index, int32 Count=1)
Definition TransArray.h:59
TArray< T > Super
Definition TransArray.h:27
UObject * GetOwner() const
Definition TransArray.h:139
int32 Remove(const T &Item)
Definition TransArray.h:123
static void DefaultConstructItem(void *TPtr)
Definition TransArray.h:174
void SetOwner(UObject *NewOwner)
Definition TransArray.h:144
void AssignButKeepOwner(const Super &Other)
Definition TransArray.h:87
void AssignButKeepOwner(Super &&Other)
Definition TransArray.h:93
void Empty(int32 Slack=0)
Definition TransArray.h:77
int32 AddUninitialized(int32 Count=1)
Definition TransArray.h:49
TTransArray & operator=(TTransArray &&)=default
void ModifyItem(int32 Index)
Definition TransArray.h:149
friend FArchive & operator<<(FArchive &Ar, TTransArray &A)
Definition TransArray.h:165
void RemoveAt(int32 Index, int32 Count=1)
Definition TransArray.h:68
Definition Object.h:95
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT void * Memzero(void *Dest, SIZE_T Count)
Definition UnrealMemory.h:131