UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Effects.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2// uLang Compiler Public API
3
4#pragma once
5
8
9namespace uLang
10{
11
12// If you change this enum macro, you must keep things in sync with both VVMVerseEffectSet.h and MakeEffectSet
13#define VERSE_ENUM_EFFECTS(v) \
14 v(suspends) \
15 v(decides) \
16 v(diverges) \
17 v(reads) \
18 v(writes) \
19 v(allocates) \
20 v(dictates) \
21 v(no_rollback)
22
23enum class EEffect : uint8_t
24{
25#define VISIT_EFFECT(Name) Name,
27#undef VISIT_EFFECT
28};
29
30#define VISIT(Name) 1 +
32#undef VISIT
33
35{
36 const char* _AttributeName;
38};
39
42
44
45struct SEffectSet : private SEffectSetBase
46{
59
60 friend constexpr SEffectSet operator~(const SEffectSet Operand)
61 {
62 SEffectSet Result;
63#define VISIT_EFFECT(Name) Result._##Name = !Operand._##Name;
65#undef VISIT_EFFECT
66 return Result;
67 }
68
70 {
71#define VISIT_EFFECT(Name) _##Name = _##Name || Rhs._##Name;
73#undef VISIT_EFFECT
74 return *this;
75 }
76 friend constexpr SEffectSet operator|(const SEffectSet Lhs, const SEffectSet Rhs)
77 {
78 SEffectSet Result;
79#define VISIT_EFFECT(Name) Result._##Name = Lhs._##Name || Rhs._##Name;
81#undef VISIT_EFFECT
82 return Result;
83 }
84
86 {
87#define VISIT_EFFECT(Name) _##Name = _##Name && Rhs._##Name;
89#undef VISIT_EFFECT
90 return *this;
91 }
92 friend constexpr SEffectSet operator&(const SEffectSet Lhs, const SEffectSet Rhs)
93 {
94 SEffectSet Result;
95#define VISIT_EFFECT(Name) Result._##Name = Lhs._##Name && Rhs._##Name;
97#undef VISIT_EFFECT
98 return Result;
99 }
100
102 {
103#define VISIT_EFFECT(Name) _##Name = (!_##Name && Rhs._##Name) || (_##Name && !Rhs._##Name);
105#undef VISIT_EFFECT
106 return *this;
107 }
108 friend constexpr SEffectSet operator^(const SEffectSet Lhs, const SEffectSet Rhs)
109 {
110 SEffectSet Result;
111#define VISIT_EFFECT(Name) Result._##Name = (!Lhs._##Name && Rhs._##Name) || (Lhs._##Name && !Rhs._##Name);
113#undef VISIT_EFFECT
114 return Result;
115 }
116
117 bool operator[](EEffect Effect) const
118 {
119 return Get(Effect);
120 }
121
122 constexpr bool HasAny(SEffectSet Rhs) const
123 {
124 bool Result = false;
125#define VISIT_EFFECT(Name) Result = Result || (_##Name && Rhs._##Name);
127#undef VISIT_EFFECT
128 return Result;
129 }
130
131 constexpr bool HasAll(SEffectSet Rhs) const
132 {
133 bool Result = true;
134#define VISIT_EFFECT(Name) Result = Result && (!Rhs._##Name || _##Name);
136#undef VISIT_EFFECT
137 return Result;
138 }
139
140 friend constexpr bool operator==(const SEffectSet Lhs, const SEffectSet Rhs)
141 {
142 bool Result = true;
143#define VISIT_EFFECT(Name) Result = Result && (Lhs._##Name == Rhs._##Name);
145#undef VISIT_EFFECT
146 return Result;
147 }
148
149 friend constexpr bool operator!=(const SEffectSet Lhs, const SEffectSet Rhs)
150 {
151 bool Result = false;
152#define VISIT_EFFECT(Name) Result = Result || (Lhs._##Name != Rhs._##Name);
154#undef VISIT_EFFECT
155 return Result;
156 }
157
158 SEffectSet With(EEffect SingleEffect, bool bEnable = true) const
159 {
160 SEffectSet Result = *this;
161 Result.Set(SingleEffect, bEnable);
162 return Result;
163 }
164
165 // The number of bits set - used for some ordering in effect decomposition
166 int32_t Num() const
167 {
168 return 0
169#define VISIT_EFFECT(Name) + (_##Name ? 1 : 0)
171#undef VISIT_EFFECT
172 ;
173 }
174
175private:
176#define VISIT_EFFECT(Name) bool _##Name : 1;
178#undef VISIT_EFFECT
179
180 bool Get(EEffect Effect) const
181 {
182 switch (Effect)
183 {
184#define VISIT_EFFECT(Name) case EEffect::Name: return _##Name;
186#undef VISIT_EFFECT
187 default: ULANG_UNREACHABLE();
188 };
189 }
190
191 void Set(EEffect Effect, bool Enable)
192 {
193 switch(Effect)
194 {
195#define VISIT_EFFECT(Name) case EEffect::Name: _##Name = Enable; break;
197#undef VISIT_EFFECT
198 default: ULANG_UNREACHABLE();
199 };
200 }
201};
202
203constexpr SEffectSet operator|(const EEffect Lhs, const EEffect Rhs)
204{
205 return SEffectSet(Lhs) | SEffectSet(Rhs);
206}
207
209{
210 static_assert(EEffectNum <= sizeof(uint32_t) * 8);
211
212 uint32_t Hash{};
213 uint32_t I{};
214#define VISIT(Name) if (Effects[EEffect::Name]) { Hash |= (1 << I); } ++I;
216#undef VISIT
217 return Hash;
218}
219
220namespace EffectSets
221{
222 // Singular effects
223 constexpr SEffectSet Converges = SEffectSet{};
224 constexpr SEffectSet Suspends = EEffect::suspends;
225 constexpr SEffectSet Computes = EEffect::diverges;
226 constexpr SEffectSet NoRollback = EEffect::no_rollback;
227 constexpr SEffectSet Decides = EEffect::decides;
228 constexpr SEffectSet Dictates = EEffect::dictates;
229
230 // Aggregate effects
231 constexpr SEffectSet Reads = EEffect::reads | EEffect::dictates;
232 constexpr SEffectSet Writes = EEffect::writes | EEffect::dictates;
233 constexpr SEffectSet Allocates = EEffect::allocates | EEffect::dictates;
234 constexpr SEffectSet Transacts = EEffect::diverges | EEffect::reads | EEffect::writes | EEffect::allocates | EEffect::dictates;
235 constexpr SEffectSet VariesDeprecated = Transacts;
236
237 // Contextual defaults
238 constexpr SEffectSet ClassAndInterfaceDefault = Transacts;
239 constexpr SEffectSet FunctionDefault = Transacts | EEffect::no_rollback;
240 constexpr SEffectSet ModuleDefault = EEffect::diverges;
241}
242
243}
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define VERSE_ENUM_EFFECTS(v)
Definition Effects.h:13
#define VISIT(Name)
Definition Effects.h:30
#define ULANG_FORCEINLINE
Definition Common.h:188
#define ULANG_UNREACHABLE()
Definition Common.h:243
Definition VVMEngineEnvironment.h:23
constexpr int32_t EEffectNum
Definition Effects.h:31
SEffectInfo GetEffectInfo(EEffect Effect)
Definition Effects.cpp:23
constexpr SEffectSet operator|(const EEffect Lhs, const EEffect Rhs)
Definition Effects.h:203
EEffect
Definition Effects.h:24
ULANG_FORCEINLINE uint32_t GetTypeHash(const TArray< T > Array)
Definition Array.h:2132
TRangeView< SEffectInfo *, SEffectInfo * > AllEffectInfos()
Definition Effects.cpp:18
@ false
Definition radaudio_common.h:23
Definition Effects.h:35
EEffect _Effect
Definition Effects.h:37
const char * _AttributeName
Definition Effects.h:36
Definition Effects.h:43
Definition Effects.h:46
constexpr SEffectSet(EEffect SingleEffect)
Definition Effects.h:53
SEffectSet & operator&=(SEffectSet Rhs)
Definition Effects.h:85
constexpr SEffectSet()
Definition Effects.h:47
bool operator[](EEffect Effect) const
Definition Effects.h:117
friend constexpr bool operator==(const SEffectSet Lhs, const SEffectSet Rhs)
Definition Effects.h:140
friend constexpr SEffectSet operator^(const SEffectSet Lhs, const SEffectSet Rhs)
Definition Effects.h:108
SEffectSet With(EEffect SingleEffect, bool bEnable=true) const
Definition Effects.h:158
int32_t Num() const
Definition Effects.h:166
friend constexpr SEffectSet operator|(const SEffectSet Lhs, const SEffectSet Rhs)
Definition Effects.h:76
friend constexpr SEffectSet operator~(const SEffectSet Operand)
Definition Effects.h:60
constexpr bool HasAll(SEffectSet Rhs) const
Definition Effects.h:131
SEffectSet & operator^=(SEffectSet Rhs)
Definition Effects.h:101
friend constexpr SEffectSet operator&(const SEffectSet Lhs, const SEffectSet Rhs)
Definition Effects.h:92
constexpr bool HasAny(SEffectSet Rhs) const
Definition Effects.h:122
friend constexpr bool operator!=(const SEffectSet Lhs, const SEffectSet Rhs)
Definition Effects.h:149
SEffectSet & operator|=(SEffectSet Rhs)
Definition Effects.h:69
Definition RangeView.h:9