UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VBPVMRuntimeType.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7#include "CoreMinimal.h"
8#include "UObject/Class.h"
10#include <atomic>
11
12// Forward declarations.
13class UObject;
14
15namespace UE::Verse
16{
17using ::GetTypeHash;
18
19#define VERSE_ENUM_RUNTIME_TYPE_KINDS(v) \
20 v(Dynamic) \
21 v(Logic) \
22 v(Float) \
23 v(Char8) \
24 v(Char32) \
25 v(Int64) \
26 v(Rational) \
27 v(String) \
28 v(Class) \
29 v(Object) \
30 v(Function) \
31 v(Option) \
32 v(Reference) \
33 v(Array) \
34 v(Map) \
35 v(Tuple) \
36 v(Struct) \
37 v(Enumeration)
38
40{
41 enum class EKind : uint8
42 {
43#define VISIT_KIND(Name) Name,
45#undef VISIT_KIND
46 };
47
48 const EKind Kind;
49
56
57 virtual ~FRuntimeType() {}
58
59 virtual void AppendDiagnosticString(FUtf8StringBuilderBase& Builder, const void* Data, uint32 RecursionDepth) const = 0;
60
61 virtual void MarkReachable(FReferenceCollector& Collector) override
62 {
63 bIsReachable.store(true, std::memory_order_relaxed);
64 }
66 {
67 bIsReachable.store(false, std::memory_order_relaxed);
68 }
69 bool IsReachable() const
70 {
71 return bIsReachable.load(std::memory_order_relaxed);
72 }
73
74 friend uint32 GetTypeHash(const FRuntimeType& Type)
75 {
76 return PointerHash(&Type);
77 }
79 {
80 uint32 CombinedHash = ::GetTypeHash(Types.Num());
81 for (FRuntimeType* Type : Types)
82 {
83 CombinedHash = HashCombine(CombinedHash, GetTypeHash(*Type));
84 }
85 return CombinedHash;
86 }
87 friend bool operator==(FRuntimeType& Lhs, FRuntimeType& Rhs)
88 {
89 return &Lhs == &Rhs;
90 }
91
92 virtual bool AreEquivalent(const void* DataA, const FRuntimeType& TypeB, const void* DataB) const = 0;
93 virtual void ExportValueToText(FString& OutputString, const void* Data, const void* DefaultData, UObject* Parent, UObject* ExportRootScope) const = 0;
94 virtual bool ImportValueFromText(const TCHAR*& InputString, void* Data, UObject* Parent, FOutputDevice* ErrorText) const = 0;
95
96 virtual void InstanceSubobjects(void* Data, void const* DefaultData, TNotNull<UObject*> Owner, FObjectInstancingGraph* InstanceGraph) const {}
97
98 virtual bool IsValid(const void* Data) const { return true; }
99
100 virtual bool HasIntrusiveUnsetOptionalState() const { return false; }
101 virtual void InitializeIntrusiveUnsetOptionalValue(void* Data) const { check(false); }
102 virtual bool IsIntrusiveOptionalValueSet(const void* Data) const
103 {
104 check(false);
105 return true;
106 }
107
108private:
109 std::atomic<bool> bIsReachable{false};
110};
111
112template <typename>
114
115#define VERSE_DEFINE_NONPARAMETRIC_RUNTIME_TYPE(RuntimeTypeType, CType) \
116 template <> \
117 struct TRuntimeTypeTraits<CType> \
118 { \
119 static RuntimeTypeType& GetType() \
120 { \
121 return RuntimeTypeType::Get(); \
122 } \
123 };
124
125// Implement the static Get functions for the global types.
126#define VERSE_IMPLEMENT_GLOBAL_RUNTIME_TYPE(RuntimeTypeClass) \
127 RuntimeTypeClass& RuntimeTypeClass::Get() \
128 { \
129 static RuntimeTypeClass StaticType; \
130 return StaticType; \
131 }
132
133COREUOBJECT_API bool AreEquivalent(const FRuntimeType& TypeA, const void* DataA, const FDynamicallyTypedValue& ValueB);
134
136{
138
139 // Verse::FRuntimeType interface.
140 COREUOBJECT_API virtual void AppendDiagnosticString(FUtf8StringBuilderBase& Builder, const void* Data, uint32 RecursionDepth) const override;
141
142 // FDynamicallyTypedValueType interface.
143 COREUOBJECT_API virtual void MarkValueReachable(void* Data, FReferenceCollector& Collector) const override;
144
145 COREUOBJECT_API virtual void InitializeValue(void* Data) const override;
146 COREUOBJECT_API virtual void InitializeValueFromCopy(void* DestData, const void* SourceData) const override;
147 COREUOBJECT_API virtual void DestroyValue(void* Data) const override;
148
149#if WITH_VERSE_VM
150 AUTORTFM_DISABLE COREUOBJECT_API virtual ::Verse::VValue ToVValue(::Verse::FAllocationContext Context, const void* Data) const override;
151#endif
152
153 COREUOBJECT_API virtual void SerializeValue(FStructuredArchive::FSlot Slot, void* Data, const void* DefaultData) const override;
154
155 COREUOBJECT_API virtual void ExportValueToText(FString& OutputString, const void* Data, const void* DefaultData, UObject* Parent, UObject* ExportRootScope) const override;
156 COREUOBJECT_API virtual bool ImportValueFromText(const TCHAR*& InputString, void* Data, UObject* Parent, FOutputDevice* ErrorText) const override;
157
158 COREUOBJECT_API virtual uint32 GetValueHash(const void* Data) const override;
159 COREUOBJECT_API virtual bool AreIdentical(const void* DataA, const void* DataB) const override;
160 COREUOBJECT_API virtual bool AreEquivalent(const void* DataA, const FRuntimeType& TypeB, const void* DataB) const override;
161
162 COREUOBJECT_API virtual void InstanceSubobjects(void* Data, void const* DefaultData, TNotNull<UObject*> Owner, FObjectInstancingGraph* InstanceGraph) const override;
163
164 COREUOBJECT_API virtual bool IsValid(const void* Data) const;
165
166private:
168 : FRuntimeType(
173 {
174 }
175};
177
178} // namespace UE::Verse
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define AUTORTFM_DISABLE
Definition AutoRTFMDefines.h:116
#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::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
T TNotNull
Definition NotNull.h:307
uint32 PointerHash(const void *Key)
Definition TypeHash.h:91
constexpr uint32 HashCombine(uint32 A, uint32 C)
Definition TypeHash.h:36
#define UE_FORCE_CONSTEVAL(expr)
Definition UnrealTemplate.h:246
#define VERSE_DEFINE_NONPARAMETRIC_RUNTIME_TYPE(RuntimeTypeType, CType)
Definition VBPVMRuntimeType.h:115
#define VERSE_ENUM_RUNTIME_TYPE_KINDS(v)
Definition VBPVMRuntimeType.h:19
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition OutputDevice.h:133
Definition UObjectGlobals.h:2492
Definition StructuredArchiveSlots.h:52
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition StringBuilder.h:79
Definition Object.h:95
Definition VBPVMRuntimeType.cpp:8
bool AreEquivalent(const FRuntimeType &TypeA, const void *DataA, const FDynamicallyTypedValue &ValueB)
Definition VBPVMRuntimeType.cpp:10
Definition UnrealMathUtility.h:270
Definition Class.h:4941
Definition DynamicallyTypedValue.h:26
uint32 GetMinAlignment() const
Definition DynamicallyTypedValue.h:61
EContainsReferences
Definition DynamicallyTypedValue.h:28
SIZE_T GetNumBytes() const
Definition DynamicallyTypedValue.h:59
Definition DynamicallyTypedValue.h:72
Definition VBPVMRuntimeType.h:136
virtual COREUOBJECT_API void DestroyValue(void *Data) const override
Definition VBPVMRuntimeType.cpp:42
virtual COREUOBJECT_API void InitializeValue(void *Data) const override
Definition VBPVMRuntimeType.cpp:47
virtual COREUOBJECT_API void MarkValueReachable(void *Data, FReferenceCollector &Collector) const override
Definition VBPVMRuntimeType.cpp:34
virtual COREUOBJECT_API void ExportValueToText(FString &OutputString, const void *Data, const void *DefaultData, UObject *Parent, UObject *ExportRootScope) const override
Definition VBPVMRuntimeType.cpp:108
static COREUOBJECT_API FRuntimeTypeDynamic & Get()
virtual COREUOBJECT_API bool AreEquivalent(const void *DataA, const FRuntimeType &TypeB, const void *DataB) const override
Definition VBPVMRuntimeType.cpp:182
virtual COREUOBJECT_API void InstanceSubobjects(void *Data, void const *DefaultData, TNotNull< UObject * > Owner, FObjectInstancingGraph *InstanceGraph) const override
Definition VBPVMRuntimeType.cpp:193
virtual COREUOBJECT_API void InitializeValueFromCopy(void *DestData, const void *SourceData) const override
Definition VBPVMRuntimeType.cpp:52
virtual COREUOBJECT_API void AppendDiagnosticString(FUtf8StringBuilderBase &Builder, const void *Data, uint32 RecursionDepth) const override
Definition VBPVMRuntimeType.cpp:22
virtual COREUOBJECT_API bool ImportValueFromText(const TCHAR *&InputString, void *Data, UObject *Parent, FOutputDevice *ErrorText) const override
Definition VBPVMRuntimeType.cpp:121
virtual COREUOBJECT_API void SerializeValue(FStructuredArchive::FSlot Slot, void *Data, const void *DefaultData) const override
Definition VBPVMRuntimeType.cpp:66
virtual COREUOBJECT_API bool AreIdentical(const void *DataA, const void *DataB) const override
Definition VBPVMRuntimeType.cpp:161
virtual COREUOBJECT_API uint32 GetValueHash(const void *Data) const override
Definition VBPVMRuntimeType.cpp:155
Definition VBPVMRuntimeType.h:40
virtual void InstanceSubobjects(void *Data, void const *DefaultData, TNotNull< UObject * > Owner, FObjectInstancingGraph *InstanceGraph) const
Definition VBPVMRuntimeType.h:96
void UnmarkReachable()
Definition VBPVMRuntimeType.h:65
virtual void InitializeIntrusiveUnsetOptionalValue(void *Data) const
Definition VBPVMRuntimeType.h:101
virtual void ExportValueToText(FString &OutputString, const void *Data, const void *DefaultData, UObject *Parent, UObject *ExportRootScope) const =0
virtual bool HasIntrusiveUnsetOptionalState() const
Definition VBPVMRuntimeType.h:100
virtual ~FRuntimeType()
Definition VBPVMRuntimeType.h:57
virtual void MarkReachable(FReferenceCollector &Collector) override
Definition VBPVMRuntimeType.h:61
virtual bool IsValid(const void *Data) const
Definition VBPVMRuntimeType.h:98
friend uint32 GetTypeHash(const TArray< FRuntimeType * > &Types)
Definition VBPVMRuntimeType.h:78
const EKind Kind
Definition VBPVMRuntimeType.h:48
bool IsReachable() const
Definition VBPVMRuntimeType.h:69
virtual void AppendDiagnosticString(FUtf8StringBuilderBase &Builder, const void *Data, uint32 RecursionDepth) const =0
FRuntimeType(EKind InKind, SIZE_T InNumBytes, uint8 InMinAlignmentLogTwo, EContainsReferences InContainsReferences)
Definition VBPVMRuntimeType.h:50
friend uint32 GetTypeHash(const FRuntimeType &Type)
Definition VBPVMRuntimeType.h:74
virtual bool AreEquivalent(const void *DataA, const FRuntimeType &TypeB, const void *DataB) const =0
friend bool operator==(FRuntimeType &Lhs, FRuntimeType &Rhs)
Definition VBPVMRuntimeType.h:87
virtual bool IsIntrusiveOptionalValueSet(const void *Data) const
Definition VBPVMRuntimeType.h:102
EKind
Definition VBPVMRuntimeType.h:42
virtual bool ImportValueFromText(const TCHAR *&InputString, void *Data, UObject *Parent, FOutputDevice *ErrorText) const =0
Definition VBPVMRuntimeType.h:113