12#include "SharedStruct.generated.h"
14#define UE_API COREUOBJECT_API
55 ,
TEXT(
"FStructSharedMemoryDeleter is expected to be used only with a valid FStructSharedMemory. "
56 "See FStructSharedMemory::Create/CreateArgs"));
68 checkf(StructMemory !=
nullptr,
TEXT(
"CreateImpl is expected to always return a valid pointer to FStructSharedMemory."));
73 UE_DEPRECATED(5.6,
"FStructSharedMemory::Create should be passed a pointer.")
79 template<
typename T,
typename...
TArgs>
82 UE::StructUtils::CheckStructType<T>();
85 checkf(StructMemory !=
nullptr,
TEXT(
"CreateImpl is expected to always return a valid pointer to FStructSharedMemory."));
143 uint8 StructMemory[0];
187 return StructMemoryPtr ? &(StructMemoryPtr.Get()->GetScriptStruct()) :
nullptr;
192 return StructMemoryPtr ? &StructMemoryPtr.
Get()->GetScriptStructPtr() :
nullptr;
198 return StructMemoryPtr ? StructMemoryPtr.Get()->GetMutableMemory() :
nullptr;
204 StructMemoryPtr.Reset();
211 UE::StructUtils::CheckStructType<T>();
217 template <
typename T>
220 if constexpr (UE::StructUtils::TIsSharedInstancedOrViewStruct_V<T>)
222 InitializeAs(
Struct.GetScriptStruct(),
Struct.GetMemory());
244 template<
typename T,
typename...
TArgs>
247 UE::StructUtils::CheckStructType<T>();
249 StructMemoryPtr = FStructSharedMemory::CreateArgs<T>(
Forward<TArgs>(InArgs)...);
279 template<
typename T,
typename...
TArgs>
308 template <
typename OtherType>
314 template <
typename OtherType>
317 return !operator==(
Other);
324 template <
typename OtherType>
327 UE::StructUtils::CheckWrapperType<OtherType>();
329 return (ScriptStruct ==
Other.GetScriptStruct())
347template<
typename BaseStructT>
353 template<
typename T = BaseStructT>
354 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
356 : SharedStruct(
InOther.SharedStruct)
360 template<
typename T = BaseStructT>
361 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
368 template<
typename T = BaseStructT>
369 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
374 SharedStruct =
InOther.SharedStruct;
379 template<
typename T = BaseStructT>
380 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
393 return SharedStruct.GetScriptStruct();
398 return SharedStruct.GetScriptStructPtr();
404 return SharedStruct.GetMemory();
410 SharedStruct.Reset();
414 template<
typename T = BaseStructT>
415 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
418 SharedStruct.InitializeAs<T>();
422 template<
typename T = BaseStructT>
424 std::is_base_of_v<BaseStructT, std::decay_t<T>>
425 && !(std::is_same_v<TStructView<T>, T>
426 || std::is_same_v<TConstStructView<T>, T>
427 || std::is_same_v<TSharedStruct<T>, T>
428 || std::is_same_v<TConstSharedStruct<T>, T>
429 || std::is_same_v<TInstancedStruct<T>, T>))
437 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
444 template<
typename T = BaseStructT>
445 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
448 return FSharedStruct::Make<T>();
452 template<
typename T = BaseStructT>
453 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
456 return FSharedStruct::Make<T>(
Struct);
460 template<
typename...
TArgs>
463 return FSharedStruct::Make<BaseStructT>(
Forward<TArgs>(InArgs)...);
467 template<
typename T = BaseStructT>
468 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
471 return SharedStruct.Get<T>();
475 template<
typename T = BaseStructT>
476 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
479 return SharedStruct.GetPtr<T>();
485 return SharedStruct.IsValid();
489 template<
typename T = BaseStructT>
490 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
491 bool operator==(
const T&
Other)
const
493 return SharedStruct.operator==(
Other);
496 template<
typename T = BaseStructT>
497 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
498 bool operator!=(
const T&
Other)
const
500 return SharedStruct.operator!=(
Other);
522 WithIdentical =
true,
523 WithAddStructReferencedObjects =
true,
545 : StructMemoryPtr(SharedStruct.StructMemoryPtr)
550 : StructMemoryPtr(
MoveTemp(SharedStruct.StructMemoryPtr))
574 return StructMemoryPtr ? &(StructMemoryPtr.Get()->GetScriptStruct()) :
nullptr;
579 return StructMemoryPtr ?
586 return StructMemoryPtr ? StructMemoryPtr.Get()->GetMemory() :
nullptr;
592 StructMemoryPtr.Reset();
599 UE::StructUtils::CheckStructType<T>();
605 template <
typename T>
608 if constexpr (UE::StructUtils::TIsSharedInstancedOrViewStruct_V<T>)
610 InitializeAs(
Struct.GetScriptStruct(),
Struct.GetMemory());
632 template<
typename T,
typename...
TArgs>
635 UE::StructUtils::CheckStructType<T>();
637 StructMemoryPtr = FStructSharedMemory::CreateArgs<T>(
Forward<TArgs>(InArgs)...);
667 template<
typename T,
typename...
TArgs>
677 requires (std::is_const_v<T>)
685 requires (std::is_const_v<T>)
698 template <
typename OtherType>
704 template <
typename OtherType>
707 return !operator==(
Other);
714 template <
typename OtherType>
717 UE::StructUtils::CheckWrapperType<OtherType>();
719 return (ScriptStruct ==
Other.GetScriptStruct())
738template<
typename BaseStructT>
743 template<
typename T = BaseStructT>
744 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
746 : ConstSharedStruct(
Other.ConstSharedStruct)
750 template<
typename T = BaseStructT>
751 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
753 : ConstSharedStruct(ConstSharedStruct.SharedStruct)
757 template<
typename T = BaseStructT>
758 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
764 template<
typename T = BaseStructT>
765 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
767 : ConstSharedStruct(
MoveTemp(ConstSharedStruct.SharedStruct))
771 template<
typename T = BaseStructT>
772 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
777 ConstSharedStruct =
Other.ConstSharedStruct;
782 template<
typename T = BaseStructT>
783 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
786 if (
this != &SharedStruct)
788 ConstSharedStruct = SharedStruct.SharedStruct;
802 ConstSharedStruct.
Reset();
812 template<
typename T = BaseStructT>
814 std::is_base_of_v<BaseStructT, std::decay_t<T>>
815 && !(std::is_same_v<TStructView<T>, T>
816 || std::is_same_v<TConstStructView<T>, T>
817 || std::is_same_v<TSharedStruct<T>, T>
818 || std::is_same_v<TConstSharedStruct<T>, T>
819 || std::is_same_v<TInstancedStruct<T>, T>))
822 ConstSharedStruct.InitializeAs<T>(
Struct);
827 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
834 template<
typename T = BaseStructT>
835 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
844 template<
typename T = BaseStructT>
845 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
854 template<
typename T = BaseStructT>
855 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
865 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
874 template<
typename T = BaseStructT>
875 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
876 constexpr const T&
Get()
const
878 return ConstSharedStruct.
Get<T>();
882 template<
typename T = BaseStructT>
883 requires (std::is_const_v<T> && std::is_base_of_v<BaseStructT, std::decay_t<T>>)
886 return ConstSharedStruct.
Get<T>();
890 template<
typename T = BaseStructT>
891 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
894 return ConstSharedStruct.
GetPtr<T>();
898 template<
typename T = BaseStructT>
899 requires (std::is_const_v<T> && std::is_base_of_v<BaseStructT, std::decay_t<T>>)
902 return ConstSharedStruct.
GetPtr<T>();
908 return ConstSharedStruct.
IsValid();
912 template<
typename T = BaseStructT>
913 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
914 bool operator==(
const T&
Other)
const
916 return ConstSharedStruct.operator==(
Other);
919 template<
typename T = BaseStructT>
920 requires (std::is_base_of_v<BaseStructT, std::decay_t<T>>)
921 bool operator!=(
const T&
Other)
const
923 return ConstSharedStruct.operator!=(
Other);
945 WithIdentical =
true,
946 WithAddStructReferencedObjects =
true,
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define CA_SUPPRESS(WarningNumber)
Definition CoreMiscDefines.h:125
SharedPointerInternals::TRawPtrProxy< ObjectType > MakeShareable(ObjectType *InObject)
Definition SharedPointer.h:1947
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define USTRUCT(...)
Definition ObjectMacros.h:746
const U & ObjectPtrDecay(const T &Value)
Definition ObjectPtr.h:1744
#define UE_API
Definition SharedStruct.h:14
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition UObjectGlobals.h:2492
Definition SharedPointer.h:692
virtual COREUOBJECT_API void InitializeStruct(void *Dest, int32 ArrayDim=1) const override
Definition Class.cpp:3782
COREUOBJECT_API void CopyScriptStruct(void *Dest, void const *Src, int32 ArrayDim=1) const
Definition Class.cpp:3730
COREUOBJECT_API bool CompareScriptStruct(const void *A, const void *B, uint32 PortFlags) const
Definition Class.cpp:3696
virtual COREUOBJECT_API void DestroyStruct(void *Dest, int32 ArrayDim=1) const override
Definition Class.cpp:3940
UE_FORCEINLINE_HINT int32 GetMinAlignment() const
Definition Class.h:769
Definition SharedStruct.h:538
FConstSharedStruct()=default
FConstSharedStruct & operator=(FConstSharedStruct &&Other)=default
FConstSharedStruct & operator=(FSharedStruct &&InSharedStruct)
Definition SharedStruct.h:561
constexpr T & Get() const
Definition SharedStruct.h:678
FConstSharedStruct(const FConstSharedStruct &Other)=default
void Reset()
Definition SharedStruct.h:590
static FConstSharedStruct Make(const UScriptStruct *InScriptStruct, const uint8 *InStructMemory=nullptr)
Definition SharedStruct.h:659
FConstSharedStruct & operator=(const FConstSharedStruct &Other)=default
bool operator!=(const OtherType &Other) const
Definition SharedStruct.h:705
bool operator==(const OtherType &Other) const
Definition SharedStruct.h:699
void InitializeAs(const T &Struct)
Definition SharedStruct.h:606
constexpr T * GetPtr() const
Definition SharedStruct.h:686
static FConstSharedStruct Make(const T &Struct)
Definition SharedStruct.h:651
static FConstSharedStruct Make(TArgs &&... InArgs)
Definition SharedStruct.h:668
FConstSharedStruct(const FSharedStruct &SharedStruct)
Definition SharedStruct.h:544
static FConstSharedStruct Make()
Definition SharedStruct.h:642
FConstSharedStruct & operator=(const FSharedStruct &SharedStruct)
Definition SharedStruct.h:554
void InitializeAs()
Definition SharedStruct.h:597
void InitializeAs(const UScriptStruct *InScriptStruct, const uint8 *InStructMemory=nullptr)
Definition SharedStruct.h:619
bool IsValid() const
Definition SharedStruct.h:692
TObjectPtr< const UScriptStruct > * GetScriptStructPtr()
Definition SharedStruct.h:577
const uint8 * GetMemory() const
Definition SharedStruct.h:584
FConstSharedStruct(FSharedStruct &&SharedStruct)
Definition SharedStruct.h:549
TSharedPtr< const FStructSharedMemory > StructMemoryPtr
Definition SharedStruct.h:725
void InitializeAs(TArgs &&... InArgs)
Definition SharedStruct.h:633
FConstSharedStruct(FConstSharedStruct &&Other)=default
bool CompareStructValues(const OtherType &Other, uint32 PortFlags=0) const
Definition SharedStruct.h:715
const UScriptStruct * GetScriptStruct() const
Definition SharedStruct.h:572
Definition StructView.h:217
Definition InstancedStruct.h:32
Definition UnrealMemory.h:94
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
Definition SharedStruct.h:161
uint8 * GetMemory() const
Definition SharedStruct.h:196
static FSharedStruct Make(const T &Struct)
Definition SharedStruct.h:263
T & Get() const
Definition SharedStruct.h:289
FSharedStruct & operator=(const FSharedStruct &InOther)=default
FSharedStruct(FSharedStruct &&InOther)=default
FSharedStruct & operator=(FSharedStruct &&InOther)=default
T * GetPtr() const
Definition SharedStruct.h:296
void InitializeAs(const UScriptStruct *InScriptStruct, const uint8 *InStructMemory=nullptr)
Definition SharedStruct.h:231
~FSharedStruct()
Definition SharedStruct.h:168
TSharedPtr< FStructSharedMemory > StructMemoryPtr
Definition SharedStruct.h:334
TObjectPtr< const UScriptStruct > * GetScriptStructPtr() const
Definition SharedStruct.h:190
static FSharedStruct Make(const UScriptStruct *InScriptStruct, const uint8 *InStructMemory=nullptr)
Definition SharedStruct.h:271
void InitializeAs()
Definition SharedStruct.h:209
bool CompareStructValues(const OtherType &Other, uint32 PortFlags=0) const
Definition SharedStruct.h:325
void Reset()
Definition SharedStruct.h:202
bool operator==(const OtherType &Other) const
Definition SharedStruct.h:309
void InitializeAs(const T &Struct)
Definition SharedStruct.h:218
void InitializeAs(TArgs &&... InArgs)
Definition SharedStruct.h:245
bool IsValid() const
Definition SharedStruct.h:302
static FSharedStruct Make()
Definition SharedStruct.h:254
static FSharedStruct Make(TArgs &&... InArgs)
Definition SharedStruct.h:280
const UScriptStruct * GetScriptStruct() const
Definition SharedStruct.h:185
FSharedStruct(const FSharedStruct &InOther)=default
bool operator!=(const OtherType &Other) const
Definition SharedStruct.h:315
Definition SharedStruct.h:51
void operator()(FStructSharedMemory *StructSharedMemory) const
Definition SharedStruct.h:52
Definition SharedStruct.h:39
const UScriptStruct & GetScriptStruct() const
Definition SharedStruct.h:104
uint8 * GetMutableMemory()
Definition SharedStruct.h:98
FStructSharedMemory(const FStructSharedMemory &Other)=delete
TObjectPtr< const UScriptStruct > & GetScriptStructPtr()
Definition SharedStruct.h:109
FStructSharedMemory(const FStructSharedMemory &&Other)=delete
static TSharedPtr< FStructSharedMemory > CreateArgs(TArgs &&... InArgs)
Definition SharedStruct.h:80
static TSharedPtr< FStructSharedMemory > Create(const UScriptStruct *InScriptStruct, const uint8 *InStructMemory=nullptr)
Definition SharedStruct.h:63
~FStructSharedMemory()
Definition SharedStruct.h:40
FStructSharedMemory & operator=(const FStructSharedMemory &&Other)=delete
const uint8 * GetMemory() const
Definition SharedStruct.h:92
FStructSharedMemory & operator=(const FStructSharedMemory &Other)=delete
Definition SharedStruct.h:740
constexpr const T & Get() const
Definition SharedStruct.h:876
TConstSharedStruct()=default
void Initialize()
Definition SharedStruct.h:806
static TConstSharedStruct Make(const uint8 *InStructMemory=nullptr)
Definition SharedStruct.h:856
bool IsValid() const
Definition SharedStruct.h:906
void Reset()
Definition SharedStruct.h:800
constexpr T & Get() const
Definition SharedStruct.h:884
void Initialize(TArgs &&... InArgs)
Definition SharedStruct.h:828
static TConstSharedStruct Make()
Definition SharedStruct.h:836
TConstSharedStruct(TConstSharedStruct< T > &&Other)
Definition SharedStruct.h:759
TConstSharedStruct(const TConstSharedStruct< T > &Other)
Definition SharedStruct.h:745
constexpr T * GetPtr() const
Definition SharedStruct.h:900
TConstSharedStruct(TSharedStruct< T > &&ConstSharedStruct)
Definition SharedStruct.h:766
static TConstSharedStruct Make(const T &Struct)
Definition SharedStruct.h:846
constexpr const T * GetPtr() const
Definition SharedStruct.h:892
static TConstSharedStruct Make(TArgs &&... InArgs)
Definition SharedStruct.h:866
TConstSharedStruct(const TSharedStruct< T > &ConstSharedStruct)
Definition SharedStruct.h:752
void Initialize(const T &Struct)
Definition SharedStruct.h:820
const uint8 * GetMemory() const
Definition SharedStruct.h:794
Definition StructView.h:328
Definition InstancedStruct.h:307
Definition ObjectPtr.h:488
FORCEINLINE T * Get() const
Definition ObjectPtr.h:664
Definition SharedStruct.h:349
bool IsValid() const
Definition SharedStruct.h:483
T * GetPtr() const
Definition SharedStruct.h:477
static TSharedStruct Make(TArgs &&... InArgs)
Definition SharedStruct.h:461
void Initialize(const T &Struct)
Definition SharedStruct.h:430
void Reset()
Definition SharedStruct.h:408
void Initialize(TArgs &&... InArgs)
Definition SharedStruct.h:438
T & Get() const
Definition SharedStruct.h:469
const UScriptStruct * GetScriptStruct() const
Definition SharedStruct.h:391
TObjectPtr< const UScriptStruct > * GetScriptStructPtr() const
Definition SharedStruct.h:396
void Initialize()
Definition SharedStruct.h:416
TSharedStruct(TSharedStruct< T > &&InOther)
Definition SharedStruct.h:362
uint8 * GetMemory() const
Definition SharedStruct.h:402
static TSharedStruct Make()
Definition SharedStruct.h:446
TSharedStruct(const TSharedStruct< T > &InOther)
Definition SharedStruct.h:355
static TSharedStruct Make(const T &Struct)
Definition SharedStruct.h:454
Definition StructOpsTypeTraits.h:11
Definition StructOpsTypeTraits.h:46
Definition StructView.h:118