UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SlateInvalidationWidgetHeap.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6
10
11#ifndef UE_SLATE_WITH_INVALIDATIONWIDGETHEAP_DEBUGGING
12 #define UE_SLATE_WITH_INVALIDATIONWIDGETHEAP_DEBUGGING DO_CHECK
13#endif
14
15namespace UE::Slate::Private
16{
17#if UE_SLATE_WITH_INVALIDATIONWIDGETHEAP_DEBUGGING
19#endif
20} // namespace
21
26{
27public:
30 {
31 FORCEINLINE bool operator()(const FElement& A, const FElement& B) const
32 {
33 return A.GetWidgetSortOrder() < B.GetWidgetSortOrder();
34 }
35 };
37
38 static constexpr int32 NumberOfPreAllocatedElement = 32;
40
44
45public:
48 {
50 VerifyContainsFlag(InvalidationWidget);
51
52 if (!InvalidationWidget.bContainedByWidgetPreHeap)
53 {
54 InvalidationWidget.bContainedByWidgetPreHeap = true;
55 Heap.HeapPush(FElement{ InvalidationWidget.Index, FSlateInvalidationWidgetSortOrder{OwnerList, InvalidationWidget.Index} }, SortPredicate());
56 }
57 }
58
61 {
62 check(Heap.Num() > 0);
63 FSlateInvalidationWidgetIndex Result = Heap.HeapTop().GetWidgetIndex();
65 OwnerList[Result].bContainedByWidgetPreHeap = false;
66 return Result;
67 }
68
71 {
72 check(Heap.Num() > 0);
73 FSlateInvalidationWidgetIndex Result = Heap.HeapTop().GetWidgetIndex();
75 OwnerList[Result].bContainedByWidgetPreHeap = false;
76 }
77
80 {
81 check(Heap.Num() > 0);
82 return Heap.HeapTop().GetWidgetIndex();
83 }
84
86 [[nodiscard]] inline const FElement& HeapPeekElement() const
87 {
88 check(Heap.Num() > 0);
89 return Heap.HeapTop();
90 }
91
94 {
95 int32 RemoveCount = 0;
96 for (int32 Index = 0; Index < Heap.Num(); ++Index)
97 {
98 if (Range.Include(Heap[Index].GetWidgetSortOrder()))
99 {
100 const FSlateInvalidationWidgetIndex WidgetIndex = Heap[Index].GetWidgetIndex();
101 OwnerList[WidgetIndex].bContainedByWidgetPreHeap = false;
103 Index = INDEX_NONE; // start again
104 }
105 }
106 return RemoveCount;
107 }
108
111 {
112 if (bResetContained)
113 {
114 for (const FElement& Element : Heap)
115 {
116 OwnerList[Element.GetWidgetIndex()].bContainedByWidgetPreHeap = false;
117 }
118 }
119
120 // Destroy the second allocator, if it exists.
122 }
123
125 [[nodiscard]] inline int32 Num() const
126 {
127 return Heap.Num();
128 }
129
132 {
133 return Heap.ContainsByPredicate([WidgetIndex](const FElement& Element)
134 {
135 return Element.GetWidgetIndex() == WidgetIndex;
136 });
137 }
138
140 [[nodiscard]] inline bool IsValidHeap_Debug()
141 {
142 return Algo::IsHeap(Heap, SortPredicate());
143 }
144
146 [[nodiscard]] inline const FElementContainer& GetRaw() const
147 {
148 return Heap;
149 }
150
152 template<typename Predicate>
153 void ForEachIndexes(Predicate Pred)
154 {
155 for (FElement& Element : Heap)
156 {
157 Pred(Element);
158 }
159 }
160
161private:
162 void VerifyContainsFlag(const FSlateInvalidationWidgetList::InvalidationWidgetType& InvalidationWidget)
163 {
164#if UE_SLATE_WITH_INVALIDATIONWIDGETHEAP_DEBUGGING
165 if (UE::Slate::Private::GSlateInvalidationWidgetHeapVerifyWidgetContains)
166 {
167 check(Contains_Debug(InvalidationWidget.Index) == InvalidationWidget.bContainedByWidgetPreHeap);
168 }
169#endif
170 }
171
174};
175
176
179{
180public:
183 {
184 FORCEINLINE bool operator()(const FElement& A, const FElement& B) const
185 {
186 return B.GetWidgetSortOrder() < A.GetWidgetSortOrder();
187 }
188 };
190
191 static constexpr int32 NumberOfPreAllocatedElement = 100;
193
199
200public:
203 {
204 check(bIsHeap);
206 VerifyContainsFlag(InvalidationWidget);
207
208 if (!InvalidationWidget.bContainedByWidgetPostHeap)
209 {
210 InvalidationWidget.bContainedByWidgetPostHeap = true;
211 Heap.HeapPush(FElement{ InvalidationWidget.Index, FSlateInvalidationWidgetSortOrder{OwnerList, InvalidationWidget.Index} }, SortPredicate());
212 }
213 }
214
217 {
218 check(bIsHeap == false);
220 VerifyContainsFlag(InvalidationWidget);
221
222 if (!InvalidationWidget.bContainedByWidgetPostHeap)
223 {
224 InvalidationWidget.bContainedByWidgetPostHeap = true;
225 Heap.Emplace(InvalidationWidget.Index, FSlateInvalidationWidgetSortOrder{OwnerList, InvalidationWidget.Index});
226 }
227 }
228
231 {
232 if (bIsHeap)
233 {
234 HeapPushUnique(InvalidationWidget);
235 }
236 else
237 {
238 PushBackUnique(InvalidationWidget);
239 }
240 }
241
244 {
245 check(bIsHeap == true);
246 FElement Result = Heap.HeapTop();
248 OwnerList[Result.GetWidgetIndex()].bContainedByWidgetPostHeap = false;
249 return Result;
250 }
251
254 {
255 check(bIsHeap == false);
256 int32 RemoveCount = 0;
257 for (int32 Index = Heap.Num() -1; Index >= 0 ; --Index)
258 {
259 if (Range.Include(Heap[Index].GetWidgetSortOrder()))
260 {
261 const FSlateInvalidationWidgetIndex WidgetIndex = Heap[Index].GetWidgetIndex();
262 OwnerList[WidgetIndex].bContainedByWidgetPostHeap = false;
263 Heap.RemoveAtSwap(Index);
264 ++RemoveCount;
265 }
266 }
267
268 return RemoveCount;
269 }
270
273 {
274 if (bResetContained)
275 {
276 for (const FElement& Element : Heap)
277 {
278 OwnerList[Element.GetWidgetIndex()].bContainedByWidgetPostHeap = false;
279 }
280 }
281
282 // Destroy the second allocator, if it exists.
284 bIsHeap = false;
285 }
286
287 void Heapify()
288 {
289 check(!bIsHeap);
290 Heap.Heapify(SortPredicate());
291 bIsHeap = true;
292 }
293
295 [[nodiscard]] inline int32 Num() const
296 {
297 return Heap.Num();
298 }
299
301 [[nodiscard]] inline bool IsHeap() const
302 {
303 return bIsHeap;
304 }
305
308 {
309 return Heap.ContainsByPredicate([WidgetIndex](const FElement& Element)
310 {
311 return Element.GetWidgetIndex() == WidgetIndex;
312 });
313 }
314
316 [[nodiscard]] inline bool IsValidHeap_Debug()
317 {
318 return Algo::IsHeap(Heap, SortPredicate());
319 }
320
322 [[nodiscard]] inline const FElementContainer& GetRaw() const
323 {
324 return Heap;
325 }
326
327 template<typename Predicate>
328 void ForEachIndexes(Predicate Pred)
329 {
330 for (FElement& Element : Heap)
331 {
332 Pred(Element);
333 }
334 }
335
336public:
360
361private:
362 void VerifyContainsFlag(const FSlateInvalidationWidgetList::InvalidationWidgetType& InvalidationWidget)
363 {
364#if UE_SLATE_WITH_INVALIDATIONWIDGETHEAP_DEBUGGING
365 if (UE::Slate::Private::GSlateInvalidationWidgetHeapVerifyWidgetContains)
366 {
367 check(Contains_Debug(InvalidationWidget.Index) == InvalidationWidget.bContainedByWidgetPostHeap
368 || WidgetCannotBeAdded == InvalidationWidget.Index);
369 }
370#endif
371 }
372
375 FSlateInvalidationWidgetIndex WidgetCannotBeAdded;
376 bool bIsHeap;
377};
378
384{
385public:
388 {
389 FORCEINLINE bool operator()(const FElement& A, const FElement& B) const
390 {
391 return A.GetWidgetSortOrder() < B.GetWidgetSortOrder();
392 }
393 };
395
396 static constexpr int32 NumberOfPreAllocatedElement = 32;
398
403
404public:
407 {
408 check(bIsHeap);
410 VerifyContainsFlag(InvalidationWidget);
411
412 if (!InvalidationWidget.bContainedByWidgetPrepassList)
413 {
414 InvalidationWidget.bContainedByWidgetPrepassList = true;
415 Heap.HeapPush(FElement{ InvalidationWidget.Index, FSlateInvalidationWidgetSortOrder{OwnerList, InvalidationWidget.Index} }, SortPredicate());
416 }
417 }
418
421 {
422 check(bIsHeap == false);
424 VerifyContainsFlag(InvalidationWidget);
425
426 if (!InvalidationWidget.bContainedByWidgetPrepassList)
427 {
428 InvalidationWidget.bContainedByWidgetPrepassList = true;
429 Heap.Emplace(InvalidationWidget.Index, FSlateInvalidationWidgetSortOrder{ OwnerList, InvalidationWidget.Index });
430 }
431 }
432
435 {
436 check(bIsHeap == true);
437 FElement Result = Heap.HeapTop();
439 OwnerList[Result.GetWidgetIndex()].bContainedByWidgetPrepassList = false;
440 return Result;
441 }
442
445 {
446 check(bIsHeap == false);
447 int32 RemoveCount = 0;
448 for (int32 Index = Heap.Num() - 1; Index >= 0; --Index)
449 {
450 if (Range.Include(Heap[Index].GetWidgetSortOrder()))
451 {
452 const FSlateInvalidationWidgetIndex WidgetIndex = Heap[Index].GetWidgetIndex();
453 OwnerList[WidgetIndex].bContainedByWidgetPrepassList = false;
454 Heap.RemoveAtSwap(Index);
455 ++RemoveCount;
456 }
457 }
458
459 return RemoveCount;
460 }
461
464 {
465 if (bResetContained)
466 {
467 for (const FElement& Element : Heap)
468 {
469 OwnerList[Element.GetWidgetIndex()].bContainedByWidgetPrepassList = false;
470 }
471 }
472
473 // Destroy the second allocator, if it exists.
475 bIsHeap = false;
476 }
477
478 void Heapify()
479 {
480 check(!bIsHeap);
481 Heap.Heapify(SortPredicate());
482 bIsHeap = true;
483 }
484
486 [[nodiscard]] inline int32 Num() const
487 {
488 return Heap.Num();
489 }
490
492 [[nodiscard]] inline bool IsHeap() const
493 {
494 return bIsHeap;
495 }
496
499 {
500 return Heap.ContainsByPredicate([WidgetIndex](const FElement& Element)
501 {
502 return Element.GetWidgetIndex() == WidgetIndex;
503 });
504 }
505
507 [[nodiscard]] inline bool IsValidHeap_Debug()
508 {
509 return Algo::IsHeap(Heap, SortPredicate());
510 }
511
513 [[nodiscard]] inline const FElementContainer& GetRaw() const
514 {
515 return Heap;
516 }
517
518 template<typename Predicate>
519 void ForEachIndexes(Predicate Pred)
520 {
521 for (FElement& Element : Heap)
522 {
523 Pred(Element);
524 }
525 }
526
527private:
528 void VerifyContainsFlag(const FSlateInvalidationWidgetList::InvalidationWidgetType& InvalidationWidget)
529 {
530#if UE_SLATE_WITH_INVALIDATIONWIDGETHEAP_DEBUGGING
531 if (UE::Slate::Private::GSlateInvalidationWidgetHeapVerifyWidgetContains)
532 {
533 check(Contains_Debug(InvalidationWidget.Index) == InvalidationWidget.bContainedByWidgetPrepassList);
534 }
535#endif
536 }
537
540 bool bIsHeap;
541};
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
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
Definition SlateInvalidationWidgetList.h:20
bool IsValidIndex(const FSlateInvalidationWidgetIndex Index) const
Definition SlateInvalidationWidgetList.h:398
Definition SlateInvalidationWidgetHeap.h:179
FElement HeapPop()
Definition SlateInvalidationWidgetHeap.h:243
void HeapPushUnique(FSlateInvalidationWidgetList::InvalidationWidgetType &InvalidationWidget)
Definition SlateInvalidationWidgetHeap.h:202
bool IsValidHeap_Debug()
Definition SlateInvalidationWidgetHeap.h:316
void Heapify()
Definition SlateInvalidationWidgetHeap.h:287
void PushBackUnique(FSlateInvalidationWidgetList::InvalidationWidgetType &InvalidationWidget)
Definition SlateInvalidationWidgetHeap.h:216
void PushBackOrHeapUnique(FSlateInvalidationWidgetList::InvalidationWidgetType &InvalidationWidget)
Definition SlateInvalidationWidgetHeap.h:230
TArray< FElement, TInlineAllocator< NumberOfPreAllocatedElement > > FElementContainer
Definition SlateInvalidationWidgetHeap.h:192
FSlateInvalidationWidgetPostHeap(FSlateInvalidationWidgetList &InOwnerList)
Definition SlateInvalidationWidgetHeap.h:194
void Reset(bool bResetContained)
Definition SlateInvalidationWidgetHeap.h:272
FWidgetOrderGreater SortPredicate
Definition SlateInvalidationWidgetHeap.h:189
void ForEachIndexes(Predicate Pred)
Definition SlateInvalidationWidgetHeap.h:328
int32 RemoveRange(const FSlateInvalidationWidgetList::FIndexRange &Range)
Definition SlateInvalidationWidgetHeap.h:253
const FElementContainer & GetRaw() const
Definition SlateInvalidationWidgetHeap.h:322
static constexpr int32 NumberOfPreAllocatedElement
Definition SlateInvalidationWidgetHeap.h:191
bool Contains_Debug(const FSlateInvalidationWidgetIndex WidgetIndex) const
Definition SlateInvalidationWidgetHeap.h:307
bool IsHeap() const
Definition SlateInvalidationWidgetHeap.h:301
int32 Num() const
Definition SlateInvalidationWidgetHeap.h:295
Definition SlateInvalidationWidgetHeap.h:26
static constexpr int32 NumberOfPreAllocatedElement
Definition SlateInvalidationWidgetHeap.h:38
void Reset(bool bResetContained)
Definition SlateInvalidationWidgetHeap.h:110
FSlateInvalidationWidgetPreHeap(FSlateInvalidationWidgetList &InOwnerList)
Definition SlateInvalidationWidgetHeap.h:41
int32 RemoveRange(const FSlateInvalidationWidgetList::FIndexRange &Range)
Definition SlateInvalidationWidgetHeap.h:93
bool Contains_Debug(const FSlateInvalidationWidgetIndex WidgetIndex) const
Definition SlateInvalidationWidgetHeap.h:131
TArray< FElement, TInlineAllocator< NumberOfPreAllocatedElement > > FElementContainer
Definition SlateInvalidationWidgetHeap.h:39
FSlateInvalidationWidgetIndex HeapPeek() const
Definition SlateInvalidationWidgetHeap.h:79
const FElement & HeapPeekElement() const
Definition SlateInvalidationWidgetHeap.h:86
FWidgetOrderLess SortPredicate
Definition SlateInvalidationWidgetHeap.h:36
void ForEachIndexes(Predicate Pred)
Definition SlateInvalidationWidgetHeap.h:153
const FElementContainer & GetRaw() const
Definition SlateInvalidationWidgetHeap.h:146
void HeapPopDiscard()
Definition SlateInvalidationWidgetHeap.h:70
void HeapPushUnique(FSlateInvalidationWidgetList::InvalidationWidgetType &InvalidationWidget)
Definition SlateInvalidationWidgetHeap.h:47
bool IsValidHeap_Debug()
Definition SlateInvalidationWidgetHeap.h:140
FSlateInvalidationWidgetIndex HeapPop()
Definition SlateInvalidationWidgetHeap.h:60
int32 Num() const
Definition SlateInvalidationWidgetHeap.h:125
Definition SlateInvalidationWidgetHeap.h:384
const FElementContainer & GetRaw() const
Definition SlateInvalidationWidgetHeap.h:513
void ForEachIndexes(Predicate Pred)
Definition SlateInvalidationWidgetHeap.h:519
FSlateInvalidationWidgetPrepassHeap(FSlateInvalidationWidgetList &InOwnerList)
Definition SlateInvalidationWidgetHeap.h:399
bool IsHeap() const
Definition SlateInvalidationWidgetHeap.h:492
void HeapPushUnique(FSlateInvalidationWidgetList::InvalidationWidgetType &InvalidationWidget)
Definition SlateInvalidationWidgetHeap.h:406
void Reset(bool bResetContained)
Definition SlateInvalidationWidgetHeap.h:463
TArray< FElement, TInlineAllocator< NumberOfPreAllocatedElement > > FElementContainer
Definition SlateInvalidationWidgetHeap.h:397
FElement HeapPop()
Definition SlateInvalidationWidgetHeap.h:434
FWidgetOrderGreater SortPredicate
Definition SlateInvalidationWidgetHeap.h:394
void PushBackUnique(FSlateInvalidationWidgetList::InvalidationWidgetType &InvalidationWidget)
Definition SlateInvalidationWidgetHeap.h:420
bool Contains_Debug(const FSlateInvalidationWidgetIndex WidgetIndex) const
Definition SlateInvalidationWidgetHeap.h:498
int32 Num() const
Definition SlateInvalidationWidgetHeap.h:486
bool IsValidHeap_Debug()
Definition SlateInvalidationWidgetHeap.h:507
static constexpr int32 NumberOfPreAllocatedElement
Definition SlateInvalidationWidgetHeap.h:396
void Heapify()
Definition SlateInvalidationWidgetHeap.h:478
int32 RemoveRange(const FSlateInvalidationWidgetList::FIndexRange &Range)
Definition SlateInvalidationWidgetHeap.h:444
Definition WidgetProxy.h:113
uint8 bContainedByWidgetPostHeap
Definition WidgetProxy.h:197
uint8 bContainedByWidgetPrepassList
Definition WidgetProxy.h:199
uint8 bContainedByWidgetPreHeap
Definition WidgetProxy.h:195
FSlateInvalidationWidgetIndex Index
Definition WidgetProxy.h:183
void HeapRemoveAt(SizeType Index, const PREDICATE_CLASS &Predicate, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:3876
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void HeapPopDiscard(const PREDICATE_CLASS &Predicate, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:3808
UE_FORCEINLINE_HINT void RemoveAtSwap(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2185
SizeType HeapPush(ElementType &&InItem, const PREDICATE_CLASS &Predicate)
Definition Array.h:3671
UE_FORCEINLINE_HINT SizeType Emplace(ArgsType &&... Args)
Definition Array.h:2561
UE_NODEBUG UE_FORCEINLINE_HINT void Heapify(const PREDICATE_CLASS &Predicate)
Definition Array.h:3640
UE_NODEBUG const ElementType & HeapTop() const UE_LIFETIMEBOUND
Definition Array.h:3848
void Empty(SizeType Slack=0)
Definition Array.h:2273
UE_NODEBUG UE_FORCEINLINE_HINT bool ContainsByPredicate(Predicate Pred) const
Definition Array.h:1538
UE_REWRITE bool IsHeap(const RangeType &Range)
Definition IsHeap.h:50
Definition DockingUtilsPrivate.h:8
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition SlateInvalidationWidgetSortOrder.h:42
Definition SlateInvalidationWidgetIndex.h:13
static const FSlateInvalidationWidgetIndex Invalid
Definition SlateInvalidationWidgetIndex.h:7
Definition SlateInvalidationWidgetList.h:33
Definition SlateInvalidationWidgetHeap.h:338
FScopeWidgetCannotBeAdded(FSlateInvalidationWidgetPostHeap &InHeap, FSlateInvalidationWidgetList::InvalidationWidgetType &InInvalidationWidget)
Definition SlateInvalidationWidgetHeap.h:339
FSlateInvalidationWidgetIndex WidgetIndex
Definition SlateInvalidationWidgetHeap.h:358
FSlateInvalidationWidgetList::InvalidationWidgetType & InvalidationWidget
Definition SlateInvalidationWidgetHeap.h:357
FSlateInvalidationWidgetPostHeap & Heap
Definition SlateInvalidationWidgetHeap.h:356
~FScopeWidgetCannotBeAdded()
Definition SlateInvalidationWidgetHeap.h:349
Definition SlateInvalidationWidgetHeap.h:183
FORCEINLINE bool operator()(const FElement &A, const FElement &B) const
Definition SlateInvalidationWidgetHeap.h:184
Definition SlateInvalidationWidgetHeap.h:30
FORCEINLINE bool operator()(const FElement &A, const FElement &B) const
Definition SlateInvalidationWidgetHeap.h:31
Definition SlateInvalidationWidgetHeap.h:388
FORCEINLINE bool operator()(const FElement &A, const FElement &B) const
Definition SlateInvalidationWidgetHeap.h:389
Definition SlateInvalidationWidgetSortOrder.h:17