UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
UnrealTemplate.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"
11#include "Templates/Requires.h"
13#include "Templates/Identity.h"
16#include <type_traits>
17
18/*-----------------------------------------------------------------------------
19 Standard templates.
20-----------------------------------------------------------------------------*/
21
23template<typename T>
24inline void Move(T& A,typename TMoveSupportTraits<T>::Copy B)
25{
26 // Destruct the previous value of A.
27 A.~T();
28
29 // Use placement new and a copy constructor so types with const members will work.
30 ::new((void*)&A) T(B);
31}
32
34template<typename T>
35inline void Move(T& A,typename TMoveSupportTraits<T>::Move B)
36{
37 // Destruct the previous value of A.
38 A.~T();
39
40 // Use placement new and a copy constructor so types with const members will work.
41 ::new((void*)&A) T(MoveTemp(B));
42}
43
44namespace UE::Core::Private
45{
46 template <typename T>
47 [[nodiscard]] constexpr auto GetDataImpl(T&& Container) -> decltype(Container.GetData())
48 {
49 return Container.GetData();
50 }
51
52 template <
53 typename T
54 UE_REQUIRES(std::is_pointer_v<decltype(+std::declval<T>())>)
55 >
56 [[nodiscard]] constexpr auto GetDataImpl(T&& Container)
57 {
58 return +Container;
59 }
60
61 template <typename T>
62 [[nodiscard]] constexpr auto GetNumImpl(const T& Container) -> decltype(Container.Num())
63 {
64 return Container.Num();
65 }
66
67 template <
68 typename T
69 UE_REQUIRES(std::is_pointer_v<decltype(+std::declval<T>())>)
70 >
71 [[nodiscard]] constexpr auto GetNumImpl(const T& Container) -> SIZE_T
72 {
73 return sizeof(Container) / sizeof(*Container);
74 }
75}
76
80template <
81 typename T
83>
84[[nodiscard]] constexpr auto GetData(T&& Container) -> decltype(UE::Core::Private::GetDataImpl((T&&)Container))
85{
87}
88
89template <typename T>
90constexpr const T* GetData(std::initializer_list<T> List)
91{
92 return List.begin();
93}
94
98template <
99 typename T
101>
102[[nodiscard]] constexpr auto GetNum(const T& Container) -> decltype(UE::Core::Private::GetNumImpl(Container))
103{
105}
106
113template <typename T>
114constexpr int32 GetNum(std::initializer_list<T> List)
115{
116 return static_cast<int32>(List.size());
117}
118
122template <typename T>
123constexpr UE_FORCEINLINE_HINT const T& AsConst(T& Ref)
124{
125 return Ref;
126}
127
131template <typename T>
132void AsConst(const T&& Ref) = delete;
133
138template <typename T, SIZE_T N>
139constexpr UE_FORCEINLINE_HINT const T (&AsConst(T (&Array)[N]))[N]
140{
141 return Array;
142}
143
145template<typename OutType, typename InType>
146constexpr bool IntFitsIn(InType In)
147{
148 static_assert(std::is_integral_v<InType> && std::is_integral_v<OutType>, "Only integers supported");
149
150 OutType Out = static_cast<OutType>(In);
151 bool bRoundtrips = In == static_cast<InType>(Out);
152
153 // Signed <-> unsigned cast requires sign test, signed -> smaller signed is covered by roundtrip sign-extension.
154 if constexpr ((static_cast<InType>(-1) < InType{}) != (static_cast<OutType>(-1) < OutType{}))
155 {
156 return bRoundtrips && (In < InType{} == Out < OutType{});
157 }
158 else
159 {
160 return bRoundtrips;
161 }
162}
163
165template<typename OutType, typename InType>
167{
168 if constexpr (std::is_signed_v<InType>)
169 {
170 checkf(IntFitsIn<OutType>(In), TEXT("Loss of data caused by narrowing conversion, In = %" INT64_FMT), (int64)In);
171 }
172 else
173 {
174 checkf(IntFitsIn<OutType>(In), TEXT("Loss of data caused by narrowing conversion, In = %" UINT64_FMT), (uint64)In);
175 }
176 return static_cast<OutType>(In);
177}
178
180template<typename OutType, typename InType>
181constexpr bool FloatFitsIn(InType In, InType Precision)
182{
183 static_assert(std::is_floating_point_v<InType> && std::is_floating_point_v<OutType>, "Only floating point supported");
184
185 OutType Out = static_cast<OutType>(In);
186 return fabs(static_cast<InType>(Out) - In) <= Precision;
187}
188
189template<typename OutType, typename InType>
191{
192 checkf(FloatFitsIn<OutType>(In, Precision), TEXT("Loss of data caused by narrowing conversion"));
193 return static_cast<OutType>(In);
194}
195
196/*----------------------------------------------------------------------------
197 Standard macros.
198----------------------------------------------------------------------------*/
199
200#ifdef __clang__
201 template <
202 typename T
204 >
205 auto UEArrayCountHelper(T& t) -> char(&)[sizeof(t) / sizeof(t[0]) + 1];
206#else
207 template <typename T, uint32 N>
208 char (&UEArrayCountHelper(const T (&)[N]))[N + 1];
209#endif
210
211// Number of elements in an array.
212#define UE_ARRAY_COUNT( array ) (sizeof(UEArrayCountHelper(array)) - 1)
213
214// Offset of a struct member.
215#ifdef __clang__
216#define STRUCT_OFFSET( struc, member ) __builtin_offsetof(struc, member)
217#else
218#define STRUCT_OFFSET( struc, member ) offsetof(struc, member)
219#endif
220
221#if PLATFORM_VTABLE_AT_END_OF_CLASS
222 #error need implementation
223#else
224 #define VTABLE_OFFSET( Class, MultipleInheritenceParent ) ( ((PTRINT) static_cast<MultipleInheritenceParent*>((Class*)1)) - 1)
225#endif
226
227namespace UE::Core::Private
228{
229 template <typename T, T Val>
230 constexpr T TForceConstEval_V = Val;
231}
232
233// Forces an expression to be evaluated at compile-time, even if it is part of a runtime expression:
234//
235// Example:
236// // Arg 3 is evaluated at runtime as it's used in a runtime context, despite the function being marked constexpr and having a compile-time argument.
237// // Requires an optimizer pass to eliminate.
238// RegisterTypeWithSizeAndLog2Alignment("MyType", sizeof(FMyType), FMath::ConstExprCeilLogTwo(alignof(FMyType)));
239//
240// // Arg 3 is evaluated at compile-time, but is non-intuitive and requires another variable to be introduced
241// constexpr SIZE_T AlignOfMyTypeLog2 = alignof(FMyType);
242// RegisterTypeWithSizeAndLog2Alignment("MyType", sizeof(FMyType), AlignOfMyTypeLog2);
243//
244// // Arg 3 is evaluated at compile time with a more direct syntax
245// RegisterTypeWithSizeAndLog2Alignment("MyType", sizeof(FMyType), UE_FORCE_CONSTEVAL(FMath::ConstExprCeilLogTwo(alignof(FMyType))));
246#define UE_FORCE_CONSTEVAL(expr) UE::Core::Private::TForceConstEval_V<std::decay_t<decltype(expr)>, (expr)>
247
251template<class ForwardIt> inline
253{
254 ForwardIt Result = First;
255 for (; ++First != Last; )
256 {
257 if (*First < *Result)
258 {
259 Result = First;
260 }
261 }
262 return Result;
263}
264
268template<class ForwardIt, class PredicateType> inline
270{
271 ForwardIt Result = First;
272 for (; ++First != Last; )
273 {
274 if (Predicate(*First,*Result))
275 {
276 Result = First;
277 }
278 }
279 return Result;
280}
281
285template<class ForwardIt> inline
287{
288 ForwardIt Result = First;
289 for (; ++First != Last; )
290 {
291 if (*Result < *First)
292 {
293 Result = First;
294 }
295 }
296 return Result;
297}
298
302template<class ForwardIt, class PredicateType> inline
304{
305 ForwardIt Result = First;
306 for (; ++First != Last; )
307 {
308 if (Predicate(*Result,*First))
309 {
310 Result = First;
311 }
312 }
313 return Result;
314}
315
321{
322protected:
323 // ensure the class cannot be constructed directly
325 // the class should not be used polymorphically
327private:
329 FNoncopyable& operator=(const FNoncopyable&);
330};
331
339template <typename RefType, typename AssignedType = RefType>
340struct TGuardValue : private FNoncopyable
341{
342 [[nodiscard]] TGuardValue(RefType& ReferenceValue, const AssignedType& NewValue)
343 : RefValue(ReferenceValue), OriginalValue(ReferenceValue)
344 {
345 RefValue = NewValue;
346 }
348 {
349 RefValue = OriginalValue;
350 }
351
358 {
359 return OriginalValue;
360 }
361
362private:
363 RefType& RefValue;
364 AssignedType OriginalValue;
365};
366
367
375template <typename RefType, typename AssignedType = RefType>
377{
378 [[nodiscard]] TOptionalGuardValue(RefType& ReferenceValue, const AssignedType& NewValue)
379 : RefValue(ReferenceValue), OriginalValue(ReferenceValue)
380 {
381 if (RefValue != NewValue)
382 {
383 RefValue = NewValue;
384 }
385 }
387 {
388 if (RefValue != OriginalValue)
389 {
390 RefValue = OriginalValue;
391 }
392 }
393
400 {
401 return OriginalValue;
402 }
403
404private:
405 RefType& RefValue;
406 AssignedType OriginalValue;
407};
408
409template <typename FuncType>
411{
413 : Func(MoveTemp(InFunc))
414 {
415 }
416
418 {
419 Func();
420 }
421
422private:
423 FuncType Func;
424};
425
429#define FGuardValue_Bitfield(ReferenceValue, NewValue) \
430 const bool PREPROCESSOR_JOIN(TempBitfield, __LINE__) = ReferenceValue; \
431 ReferenceValue = NewValue; \
432 const TGuardValue_Bitfield_Cleanup<TFunction<void()>> PREPROCESSOR_JOIN(TempBitfieldCleanup, __LINE__)([&](){ ReferenceValue = PREPROCESSOR_JOIN(TempBitfield, __LINE__); });
433
439template <typename Type>
441{
442 [[nodiscard]] explicit TScopeCounter(Type& ReferenceValue)
443 : RefValue(ReferenceValue)
444 {
445 ++RefValue;
446 }
448 {
449 --RefValue;
450 }
451
452private:
453 Type& RefValue;
454};
455
456
460template <typename KeyType, typename ValueType>
462{
463 TKeyValuePair( const KeyType& InKey, const ValueType& InValue )
465 {
466 }
467 TKeyValuePair( const KeyType& InKey )
468 : Key(InKey)
469 {
470 }
472 {
473 }
474 bool operator==( const TKeyValuePair& Other ) const
475 {
476 return Key == Other.Key;
477 }
478 bool operator!=( const TKeyValuePair& Other ) const
479 {
480 return Key != Other.Key;
481 }
482 bool operator<( const TKeyValuePair& Other ) const
483 {
484 return Key < Other.Key;
485 }
487 {
488 return A.Key < B.Key;
489 }
490 KeyType Key;
491 ValueType Value;
492};
493
494//
495// Macros that can be used to specify multiple template parameters in a macro parameter.
496// This is necessary to prevent the macro parsing from interpreting the template parameter
497// delimiting comma as a macro parameter delimiter.
498//
499
500#define TEMPLATE_PARAMETERS2(X,Y) X,Y
501
502
511template <typename T> struct TRemovePointer { typedef T Type; };
512template <typename T> struct TRemovePointer<T*> { typedef T Type; };
513
519template <typename T>
520UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t<T>&& MoveTemp(T&& Obj) noexcept
521{
522 using CastType = std::remove_reference_t<T>;
523
524 // Validate that we're not being passed an rvalue or a const object - the former is redundant, the latter is almost certainly a mistake
525 static_assert(std::is_lvalue_reference_v<T>, "MoveTemp called on an rvalue");
526 static_assert(!std::is_same_v<CastType&, const CastType&>, "MoveTemp called on a const object");
527
528 return (CastType&&)Obj;
529}
530
537template <typename T>
538UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t<T>&& MoveTempIfPossible(T&& Obj) noexcept
539{
540 using CastType = std::remove_reference_t<T>;
541 return (CastType&&)Obj;
542}
543
553template <typename T>
555{
556 return const_cast<const T&>(Val);
557}
558
559template <typename T>
561{
562 return Val;
563}
564
573template <typename T>
574UE_REWRITE constexpr std::decay_t<T> CopyTempIfNecessary(T&& Val)
575{
576 return (T&&)Val;
577}
578
583template <typename T>
584UE_INTRINSIC_CAST UE_REWRITE constexpr T&& Forward(std::remove_reference_t<T>& Obj) noexcept
585{
586 return (T&&)Obj;
587}
588
589template <typename T>
590UE_INTRINSIC_CAST UE_REWRITE constexpr T&& Forward(std::remove_reference_t<T>&& Obj) noexcept
591{
592 return (T&&)Obj;
593}
594
598template <typename T>
599constexpr inline void Swap(T& A, T& B)
600{
601 // std::is_swappable isn't correct here, because we allow bitwise swapping of types containing e.g. const and reference members,
602 // but we don't want to allow swapping of types which are UE_NONCOPYABLE or equivalent. We also allow bitwise swapping of arrays, so
603 // extents should be removed first.
604 static_assert(std::is_move_constructible_v<std::remove_all_extents_t<T>>, "Cannot swap non-movable types");
605
606 if constexpr (TUseBitwiseSwap<T>::Value)
607 {
608 struct FAlignedBytes
609 {
610 alignas(T) char Bytes[sizeof(T)];
611 };
612
613 FAlignedBytes Temp;
614 *(FAlignedBytes*)&Temp = *(FAlignedBytes*)&A;
615 *(FAlignedBytes*)&A = *(FAlignedBytes*)&B;
616 *(FAlignedBytes*)&B = *(FAlignedBytes*)&Temp;
617 }
618 else
619 {
620 T Temp = MoveTemp(A);
621 A = MoveTemp(B);
622 B = MoveTemp(Temp);
623 }
624}
625
626template <typename T>
627UE_REWRITE constexpr void Exchange(T& A, T& B)
628{
629 Swap(A, B);
630}
631
637template <typename T, typename ArgType>
639{
640 return static_cast<T>(Arg);
641}
642
646template <typename T> struct TRValueToLValueReference { typedef T Type; };
647template <typename T> struct TRValueToLValueReference<T&&> { typedef T& Type; };
648
656template <
657 typename T
658 UE_REQUIRES(std::is_same_v<T, uint32>)
659>
660inline T ReverseBits( T Bits )
661{
662 Bits = ( Bits << 16) | ( Bits >> 16);
663 Bits = ( (Bits & 0x00ff00ff) << 8 ) | ( (Bits & 0xff00ff00) >> 8 );
664 Bits = ( (Bits & 0x0f0f0f0f) << 4 ) | ( (Bits & 0xf0f0f0f0) >> 4 );
665 Bits = ( (Bits & 0x33333333) << 2 ) | ( (Bits & 0xcccccccc) >> 2 );
666 Bits = ( (Bits & 0x55555555) << 1 ) | ( (Bits & 0xaaaaaaaa) >> 1 );
667 return Bits;
668}
669
673template <typename T>
675
676template <>
678{
679 checkSlow(Count <= 64);
680 return (uint64(Count < 64) << Count) - 1;
681}
682
683template <>
685{
686 checkSlow(Count <= 32);
687 return uint32(uint64(1) << Count) - 1;
688}
689
690template <>
692{
693 checkSlow(Count <= 16);
694 return uint16((uint32(1) << Count) - 1);
695}
696
697template <>
699{
700 checkSlow(Count <= 8);
701 return uint8((uint32(1) << Count) - 1);
702}
703
704
706template< class T >
708{
710 {
711 T::Get();
712 }
713};
714
717{
719 {}
720
722 {}
723};
724
730template <typename T>
732
742template <typename T>
744{
745 return Obj;
746}
747
752template <
753 typename T,
754 typename Base
755 UE_REQUIRES(std::is_convertible_v<std::remove_reference_t<T>*, const volatile Base*>)
756>
757UE_INTRINSIC_CAST UE_REWRITE decltype(auto) ForwardAsBase(std::remove_reference_t<T>& Obj)
758{
760}
761
762template <
763 typename T,
764 typename Base
765 UE_REQUIRES(std::is_convertible_v<std::remove_reference_t<T>*, const volatile Base*>)
766>
767UE_INTRINSIC_CAST UE_REWRITE decltype(auto) ForwardAsBase(std::remove_reference_t<T>&& Obj)
768{
770}
771
772#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_4
773#include "Templates/AndOrNot.h"
774#include "Templates/EnableIf.h"
776#endif
#define UINT64_FMT
Definition AndroidPlatformString.h:66
#define INT64_FMT
Definition AndroidPlatformString.h:59
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
typename TCopyQualifiersAndRefsFromTo< From, To >::Type TCopyQualifiersAndRefsFromTo_T
Definition CopyQualifiersAndRefsFromTo.h:24
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
#define UE_REWRITE
Definition Platform.h:747
#define UE_INTRINSIC_CAST
Definition Platform.h:839
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
#define UE_REQUIRES(...)
Definition Requires.h:86
float Val(const FString &Value)
Definition UnrealMath.cpp:3163
UE_REWRITE T StaticCast(ArgType &&Arg)
Definition UnrealTemplate.h:638
UE_REWRITE constexpr std::decay_t< T > CopyTempIfNecessary(T &&Val)
Definition UnrealTemplate.h:574
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTempIfPossible(T &&Obj) noexcept
Definition UnrealTemplate.h:538
uint16 BitMask< uint16 >(uint32 Count)
Definition UnrealTemplate.h:691
void Move(T &A, typename TMoveSupportTraits< T >::Copy B)
Definition UnrealTemplate.h:24
uint64 BitMask< uint64 >(uint32 Count)
Definition UnrealTemplate.h:677
UE_INTRINSIC_CAST UE_REWRITE decltype(auto) ForwardAsBase(std::remove_reference_t< T > &Obj)
Definition UnrealTemplate.h:757
UE_REWRITE constexpr void Exchange(T &A, T &B)
Definition UnrealTemplate.h:627
uint32 BitMask< uint32 >(uint32 Count)
Definition UnrealTemplate.h:684
constexpr bool FloatFitsIn(InType In, InType Precision)
Definition UnrealTemplate.h:181
OutType IntCastChecked(InType In)
Definition UnrealTemplate.h:166
T ReverseBits(T Bits)
Definition UnrealTemplate.h:660
T && DeclVal()
constexpr bool IntFitsIn(InType In)
Definition UnrealTemplate.h:146
OutType FloatCastChecked(InType In, InType Precision)
Definition UnrealTemplate.h:190
UE_REWRITE T CopyTemp(T &Val)
Definition UnrealTemplate.h:554
UE_FORCEINLINE_HINT T BitMask(uint32 Count)
uint8 BitMask< uint8 >(uint32 Count)
Definition UnrealTemplate.h:698
UE_REWRITE constexpr T ImplicitConv(typename TIdentity< T >::Type Obj)
Definition UnrealTemplate.h:743
char(& UEArrayCountHelper(const T(&)[N]))[N+1]
constexpr auto GetData(T &&Container) -> decltype(UE::Core::Private::GetDataImpl((T &&) Container))
Definition UnrealTemplate.h:84
ForwardIt MaxElement(ForwardIt First, ForwardIt Last)
Definition UnrealTemplate.h:286
ForwardIt MinElement(ForwardIt First, ForwardIt Last)
Definition UnrealTemplate.h:252
constexpr auto GetNum(const T &Container) -> decltype(UE::Core::Private::GetNumImpl(Container))
Definition UnrealTemplate.h:102
constexpr UE_FORCEINLINE_HINT const T & AsConst(T &Ref)
Definition UnrealTemplate.h:123
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition UnrealTemplate.h:321
FNoncopyable()
Definition UnrealTemplate.h:324
~FNoncopyable()
Definition UnrealTemplate.h:326
implementation
Definition PlayInEditorLoadingScope.h:8
constexpr auto GetDataImpl(T &&Container) -> decltype(Container.GetData())
Definition UnrealTemplate.h:47
constexpr auto GetNumImpl(const T &Container) -> decltype(Container.Num())
Definition UnrealTemplate.h:62
constexpr T TForceConstEval_V
Definition UnrealTemplate.h:230
Definition UnrealTemplate.h:717
FNoopStruct()
Definition UnrealTemplate.h:718
~FNoopStruct()
Definition UnrealTemplate.h:721
Definition UnrealTemplate.h:708
TForceInitAtBoot()
Definition UnrealTemplate.h:709
Definition UnrealTemplate.h:411
TGuardValue_Bitfield_Cleanup(FuncType &&InFunc)
Definition UnrealTemplate.h:412
~TGuardValue_Bitfield_Cleanup()
Definition UnrealTemplate.h:417
Definition UnrealTemplate.h:341
UE_FORCEINLINE_HINT const AssignedType & GetOriginalValue() const
Definition UnrealTemplate.h:357
~TGuardValue()
Definition UnrealTemplate.h:347
TGuardValue(RefType &ReferenceValue, const AssignedType &NewValue)
Definition UnrealTemplate.h:342
T Type
Definition Identity.h:19
Definition IsContiguousContainer.h:16
Definition UnrealTemplate.h:462
KeyType Key
Definition UnrealTemplate.h:490
ValueType Value
Definition UnrealTemplate.h:491
TKeyValuePair()
Definition UnrealTemplate.h:471
UE_FORCEINLINE_HINT bool operator()(const TKeyValuePair &A, const TKeyValuePair &B) const
Definition UnrealTemplate.h:486
bool operator!=(const TKeyValuePair &Other) const
Definition UnrealTemplate.h:478
TKeyValuePair(const KeyType &InKey, const ValueType &InValue)
Definition UnrealTemplate.h:463
bool operator==(const TKeyValuePair &Other) const
Definition UnrealTemplate.h:474
TKeyValuePair(const KeyType &InKey)
Definition UnrealTemplate.h:467
bool operator<(const TKeyValuePair &Other) const
Definition UnrealTemplate.h:482
TCallTraits< T >::ParamType Copy
Definition UnrealTypeTraits.h:360
Definition UnrealTypeTraits.h:392
Definition UnrealTemplate.h:377
~TOptionalGuardValue()
Definition UnrealTemplate.h:386
UE_FORCEINLINE_HINT const AssignedType & GetOriginalValue() const
Definition UnrealTemplate.h:399
TOptionalGuardValue(RefType &ReferenceValue, const AssignedType &NewValue)
Definition UnrealTemplate.h:378
T & Type
Definition UnrealTemplate.h:647
Definition UnrealTemplate.h:646
T Type
Definition UnrealTemplate.h:646
T Type
Definition UnrealTemplate.h:512
Definition UnrealTemplate.h:511
T Type
Definition UnrealTemplate.h:511
Definition UnrealTemplate.h:441
TScopeCounter(Type &ReferenceValue)
Definition UnrealTemplate.h:442
~TScopeCounter()
Definition UnrealTemplate.h:447
Definition UseBitwiseSwap.h:13