UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VVMNativeString.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7
8namespace Verse
9{
10class FNativeString;
11}
12
13template <>
14struct TIsZeroConstructType<Verse::FNativeString>
15{
16 static constexpr bool Value = true;
17};
18
19template <>
20struct TIsContiguousContainer<Verse::FNativeString>
21{
22 static constexpr bool Value = true;
23};
24
25namespace Verse
26{
27// Wraps a copy-on-write reference to a Utf8String to give it Verse semantics,
28// and since we copy objects around and don't modify them often in the VM gives
29// us a performance uplift in heavy string workloads.
31{
32 struct FCopyOnWriteContents final
33 {
34 FCopyOnWriteContents() = default;
35 FCopyOnWriteContents(const FUtf8String& String)
36 : String(String) {}
37 FCopyOnWriteContents(FUtf8String&& String)
38 : String(String) {}
39
41 mutable int32 CachedHash = 0;
42
43 inline int32 Hash() const
44 {
45 if (0 == CachedHash)
46 {
47 // Do not forward to GetTypeHash(const FUtf8String&), which is case-insensitive.
48 CachedHash = FCrc::StrCrc32Len(*String, String.Len());
49
50 // 0 is technically a valid hash result, but since we are using it to mean the
51 // hash was not cached, if we get a hash result of 0 we modify the saved value.
52 if (UNLIKELY(0 == CachedHash))
53 {
54 CachedHash = -1;
55 }
56 }
57
58 return CachedHash;
59 }
60
61 UE_FORCEINLINE_HINT void ResetCachedHash()
62 {
63 CachedHash = 0;
64 }
65 };
66
67 struct FCopyOnWrite final
68 {
69 UE_FORCEINLINE_HINT FCopyOnWrite() = default;
70 UE_FORCEINLINE_HINT FCopyOnWrite(const FUtf8String& String)
74
75 const FUtf8String& Read() const
76 {
77 const_cast<FCopyOnWrite*>(this)->SetIfNull();
78 return Payload->String;
79 }
80
81 FUtf8String& Write()
82 {
83 if (!SetIfNull())
84 {
85 if (!Payload.IsUnique())
86 {
88 }
89
90 // Since we are writing to the string we need to forget any previous cached hash we stored.
91 Payload->ResetCachedHash();
92 }
93
94 return Payload->String;
95 }
96
97 int32 Hash() const
98 {
99 const_cast<FCopyOnWrite*>(this)->SetIfNull();
100 return Payload->Hash();
101 }
102
103 private:
105
106 static_assert(TIsZeroConstructType<decltype(Payload)>::Value);
107
108 inline bool SetIfNull()
109 {
110 if (UNLIKELY(!Payload.IsValid()))
111 {
113 return true;
114 }
115
116 return false;
117 }
118 };
119
120public:
121 using ElementType = FUtf8String::ElementType;
122
123private:
124 FCopyOnWrite Payload;
125
126public:
127 FNativeString() = default;
129 FNativeString(const FNativeString&) = default;
132
134 : Payload(Str) {}
135
138
139 template <
140 typename CharRangeType,
144 : Payload(FUtf8String(Forward<CharRangeType>(Range)))
145 {
146 }
147
148 template <
149 typename CharRangeType,
151 UE_REQUIRES(TIsContiguousContainer<CharRangeType>::Value&& std::is_same_v<ElementType, CharRangeElementType>)>
153 {
154 Payload = FUtf8String(Forward<CharRangeType>(Range));
155 return *this;
156 }
157
159 friend UE_FORCEINLINE_HINT const ElementType* GetData(const FNativeString& InString) { return GetData(InString.Payload.Read()); }
160
161 friend UE_FORCEINLINE_HINT int32 GetNum(const FNativeString& InString) { return GetNum(InString.Payload.Read()); }
162
165
166 [[nodiscard]] UE_FORCEINLINE_HINT const ElementType* operator*() const UE_LIFETIMEBOUND { return *Payload.Read(); }
167
168 [[nodiscard]] UE_FORCEINLINE_HINT int Len() const { return Payload.Read().Len(); }
169 [[nodiscard]] UE_FORCEINLINE_HINT bool IsEmpty() const { return Payload.Read().IsEmpty(); }
170
172 {
173 // Do not forward to FUtf8String::operator==, which is case-insensitive.
174 return Lhs.Equals(Rhs);
175 }
176
178 {
179 // Do not forward to FUtf8String::operator!=, which is case-insensitive.
180 return !Lhs.Equals(Rhs);
181 }
182
184 {
185 return Payload.Read().Equals(Other.Payload.Read(), ESearchCase::CaseSensitive);
186 }
187
189 {
190 return S.Payload.Hash();
191 }
192
193 void Reset(int32 NewReservedSize = 0) { Payload.Write().Reset(NewReservedSize); }
194
195 template <
196 typename CharRangeType,
200 {
201 Payload.Write() += Forward<CharRangeType>(Str);
202 return *this;
203 }
205 {
206 Payload.Write() += Str;
207 return *this;
208 }
209
210 template <
211 typename CharRangeType,
213 UE_REQUIRES(TIsContiguousContainer<CharRangeType>::Value&& std::is_same_v<ElementType, CharRangeElementType>)>
215 {
216 Lhs.Payload.Write() += Forward<CharRangeType>(Rhs);
217 return Lhs;
218 }
219 inline friend FNativeString operator+(FNativeString&& Lhs, const ANSICHAR* Rhs)
220 {
221 Lhs.Payload.Write() += Rhs;
222 return Lhs;
223 }
224
225 template <typename... Types>
227 {
228 return FUtf8String::Printf(Fmt, Args...);
229 }
230
231 friend UE_FORCEINLINE_HINT FArchive& operator<<(FArchive& Ar, FNativeString& S) { return Ar << S.Payload.Write(); }
232
234 {
235 const AutoRTFM::EContextStatus Status = AutoRTFM::Close([&] { Closed = Open; });
236 ensure(AutoRTFM::EContextStatus::OnTrack == Status);
237 }
238};
239} // namespace Verse
240
241// A more UHT friendly name for a verse native string
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define UE_LIFETIMEBOUND
Definition Platform.h:812
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
#define UNLIKELY(x)
Definition Platform.h:857
FPlatformTypes::ANSICHAR ANSICHAR
An ANSI character. Normally a signed type.
Definition Platform.h:1131
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
typename TElementType< T >::Type TElementType_T
Definition ElementType.h:57
#define UE_REQUIRES(...)
Definition Requires.h:86
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition Archive.h:1208
Definition SharedPointer.h:692
UE_FORCEINLINE_HINT const bool IsValid() const
Definition SharedPointer.h:1085
Definition VVMNativeString.h:31
FNativeString & operator+=(const ANSICHAR *Str)
Definition VVMNativeString.h:204
FNativeString & operator=(const FNativeString &)=default
UE_FORCEINLINE_HINT friend bool operator!=(const FNativeString &Lhs, const FNativeString &Rhs)
Definition VVMNativeString.h:177
UE_FORCEINLINE_HINT bool IsEmpty() const
Definition VVMNativeString.h:169
FNativeString(const FNativeString &)=default
FNativeString & operator+=(CharRangeType &&Str)
Definition VVMNativeString.h:199
static UE_FORCEINLINE_HINT FNativeString Printf(UE::Core::TCheckedFormatString< FUtf8String::FmtCharType, Types... > Fmt, Types... Args)
Definition VVMNativeString.h:226
void Reset(int32 NewReservedSize=0)
Definition VVMNativeString.h:193
FNativeString & operator=(CharRangeType &&Range)
Definition VVMNativeString.h:152
friend UE_FORCEINLINE_HINT int32 GetNum(const FNativeString &InString)
Definition VVMNativeString.h:161
friend FNativeString operator+(FNativeString &&Lhs, const ANSICHAR *Rhs)
Definition VVMNativeString.h:219
friend FNativeString operator+(FNativeString &&Lhs, CharRangeType &&Rhs)
Definition VVMNativeString.h:214
UE_FORCEINLINE_HINT FNativeString(FUtf8String &&InString)
Definition VVMNativeString.h:136
UE_FORCEINLINE_HINT ElementType & operator[](int32 Index) UE_LIFETIMEBOUND
Definition VVMNativeString.h:163
friend UE_FORCEINLINE_HINT FArchive & operator<<(FArchive &Ar, FNativeString &S)
Definition VVMNativeString.h:231
FNativeString(FNativeString &&)=default
friend UE_FORCEINLINE_HINT int32 GetTypeHash(const FNativeString &S)
Definition VVMNativeString.h:188
UE_FORCEINLINE_HINT bool Equals(const FNativeString &Other) const
Definition VVMNativeString.h:183
UE_FORCEINLINE_HINT const ElementType * operator*() const UE_LIFETIMEBOUND
Definition VVMNativeString.h:166
UE_FORCEINLINE_HINT FNativeString(CharRangeType &&Range)
Definition VVMNativeString.h:143
UE_FORCEINLINE_HINT friend bool operator==(const FNativeString &Lhs, const FNativeString &Rhs)
Definition VVMNativeString.h:171
friend UE_FORCEINLINE_HINT const ElementType * GetData(const FNativeString &InString)
Definition VVMNativeString.h:159
FNativeString & operator=(FNativeString &&)=default
friend UE_FORCEINLINE_HINT ElementType * GetData(FNativeString &InString)
Definition VVMNativeString.h:158
static void AutoRTFMAssignFromOpenToClosed(FNativeString &Closed, const FNativeString &Open)
Definition VVMNativeString.h:233
FUtf8String::ElementType ElementType
Definition VVMNativeString.h:121
UE_FORCEINLINE_HINT const ElementType & operator[](int32 Index) const UE_LIFETIMEBOUND
Definition VVMNativeString.h:164
UE_FORCEINLINE_HINT FNativeString(const ANSICHAR *Str)
Definition VVMNativeString.h:133
UE_FORCEINLINE_HINT int Len() const
Definition VVMNativeString.h:168
@ CaseSensitive
Definition CString.h:23
Definition Archive.h:36
U16 Index
Definition radfft.cpp:71
static uint32 StrCrc32Len(const CharType *Data, int32 Length, uint32 CRC=0)
Definition Crc.h:67
Definition IsContiguousContainer.h:16
static constexpr bool Value
Definition IsContiguousContainer.h:20
Definition UnrealTypeTraits.h:172