UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
NetResult.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6#include "CoreMinimal.h"
7#include "HAL/Platform.h"
10#include "Templates/IsEnum.h"
11#include "Templates/PimplPtr.h"
12#include "Templates/TypeHash.h"
14#include "UObject/Class.h"
18
19
20namespace UE
21{
22namespace Net
23{
24
25// Forward declarations
26struct FNetResult;
27template<typename> struct TNetResult;
28
29
30// Expose FNetResult friend functions for Argument Dependent Lookup
32TNetResult<T>* Cast(FNetResult* InResult);
33
35const TNetResult<T>* Cast(const FNetResult* InResult);
36
37
42{
45
48
51};
52
53namespace Private
54{
55 NETCORE_API void NetResultToString(FString& OutResultStr, const TCHAR* LexResult, const FString& ErrorContext,
57}
58
59
64{
65 template<typename> friend struct TNetResult;
66
67private:
69 : Result(InResult)
70 , ResultEnumObj(InResultEnumObj)
71 , RawResultEnumObj(InResultEnumObj)
72 {
73 }
74
75 inline FNetResult(uint64 InResult, const UEnum* InResultEnumObj, const FString& InErrorContext)
76 : Result(InResult)
77 , ResultEnumObj(InResultEnumObj)
78 , RawResultEnumObj(InResultEnumObj)
80 {
81 }
82
83 inline FNetResult(uint64 InResult, const UEnum* InResultEnumObj, FString&& InErrorContext)
84 : Result(InResult)
85 , ResultEnumObj(InResultEnumObj)
86 , RawResultEnumObj(InResultEnumObj)
88 {
89 }
90
91public:
92 FNetResult(const FNetResult&) = default;
93 FNetResult& operator=(const FNetResult&) = default;
94 FNetResult(FNetResult&&) = default;
96 ~FNetResult() = default;
97
98
101 bool operator == (const FNetResult& A) const
102 {
103 return Result == A.Result && ErrorContext == A.ErrorContext && RawResultEnumObj == A.RawResultEnumObj &&
104 NextResult.IsValid() == A.NextResult.IsValid() && (!NextResult.IsValid() || *NextResult == *A.NextResult);
105 }
106
107 bool operator != (const FNetResult& A) const
108 {
109 return !(FNetResult::operator == (A));
110 }
111
112
119 template<typename T, typename>
121 {
122 TNetResult<T>* ReturnVal = nullptr;
123
124 if (InResult != nullptr && InResult->RawResultEnumObj == StaticEnum<T>())
125 {
126 ReturnVal = static_cast<TNetResult<T>*>(InResult);
127 }
128
129 return ReturnVal;
130 }
131
138 template<typename T, typename>
139 friend const TNetResult<T>* Cast(const FNetResult* InResult)
140 {
141 const TNetResult<T>* ReturnVal = nullptr;
142
143 if (InResult != nullptr && InResult->RawResultEnumObj == StaticEnum<T>())
144 {
145 ReturnVal = static_cast<const TNetResult<T>*>(InResult);
146 }
147
148 return ReturnVal;
149 }
150
151
159
161 {
162 return HashCombine(::GetTypeHash((uint64)Hash.Result), ::GetTypeHash(Hash.RawResultEnumObj));
163 }
164
165
172 {
173 FNetResult* ChainEnd = this;
174
175 // Not intended to be fast, just in a useful order while using less members
176 while (ChainEnd->NextResult.IsValid())
177 {
178 ChainEnd = ChainEnd->NextResult.Get();
179 }
180
182 }
183
191 {
192 FNetResult* ChainEnd = this;
193
194 // Not intended to be fast, just in a useful order while using less members
195 while (ChainEnd->NextResult.IsValid())
196 {
197 ChainEnd = ChainEnd->NextResult.Get();
198 }
199
201 }
202
212 {
213 for (FConstIterator It(*this); It; ++It)
214 {
215 const TNetResult<ResultEnum>* CurResult = Cast<ResultEnum>(&*It);
216
217 if (CurResult != nullptr && static_cast<ResultEnum>(CurResult->Result) == A)
218 {
219 return true;
220 }
221 }
222
223 return false;
224 }
225
226
227public:
229 struct FConstIterator final
230 {
232 : CurResult(&InResult)
233 {
234 }
235
236 explicit operator bool() const
237 {
238 return CurResult != nullptr;
239 }
240
241 const FNetResult& operator *() const
242 {
243 check(CurResult != nullptr);
244
245 return *CurResult;
246 }
247
248 const FNetResult* operator ->() const
249 {
250 return CurResult;
251 }
252
254 {
255 if (CurResult != nullptr)
256 {
257 CurResult = CurResult->NextResult.Get();
258 }
259 }
260
261 private:
262 const FNetResult* CurResult;
263 };
264
265
266private:
268 uint64 Result = 0;
269
271 TWeakObjectPtr<const UEnum> ResultEnumObj;
272
274 const void* RawResultEnumObj = nullptr;
275
277 FString ErrorContext;
278
281};
282
290{
291 if (ResultPtr.IsValid())
292 {
293 ResultPtr->AddChainResult(MoveTemp(Result));
294 }
295 else
296 {
298 }
299}
300
309{
310 const bool bValidResultPtr = ResultPtr.IsValid();
311 FNetResult ReturnVal(bValidResultPtr ? MoveTemp(*ResultPtr) : MoveTemp(Result));
312
313 if (bValidResultPtr)
314 {
316 }
317
318 return ReturnVal;
319}
320
321
328template<typename ResultEnum>
329struct TNetResult final : public FNetResult
330{
331 static_assert(TIsEnum<ResultEnum>::Value, "ResultEnum must be an enum");
332 static_assert(ResultEnum::Success != ResultEnum::Unknown, "ResultEnum must contain a 'Success' and 'Unknown' (i.e. undetermined) value");
333
334 using UnderlyingResultType = __underlying_type(ResultEnum);
335
336public:
342 TNetResult(ResultEnum InResult=ResultEnum::Unknown)
344 {
345 if (InResult != ResultEnum::Unknown && InResult != ResultEnum::Success)
346 {
347 ErrorContext = DefaultErrorContext(InResult);
348 }
349 }
350
359 {
360 if (InResult != ResultEnum::Unknown && InResult != ResultEnum::Success)
361 {
362 ErrorContext = (InErrorContext.IsEmpty() ? DefaultErrorContext(InResult) : InErrorContext);
363 }
364 }
365
366
374 {
375 using namespace UE::Net::Private;
376
377 FString ReturnVal;
379
380 for (FConstIterator It(*this); It; ++It)
381 {
382 const TCHAR* ResultLex = ToCStr(LexToString(static_cast<ResultEnum>(It->Result)));
383
385 {
387 }
388 else
389 {
391 }
392
393 if (!bIncludeChain)
394 {
395 break;
396 }
397 }
398
399 return ReturnVal;
400 }
401
402
405 bool WasSuccessful() const
406 {
407 return static_cast<ResultEnum>(Result) == ResultEnum::Success;
408 }
409
411 {
412 return static_cast<ResultEnum>(Result);
413 }
414
415 const FString& GetErrorContext() const
416 {
417 return ErrorContext;
418 }
419
420
428 bool HasChainResult(const TNetResult& A) const
429 {
430 for (FConstIterator It(*this); It; ++It)
431 {
432 if (*It == A)
433 {
434 return true;
435 }
436 }
437
438 return false;
439 }
440
441
445 {
446 return static_cast<ResultEnum>(Result) == A;
447 }
448
450 {
451 return !(TNetResult::operator == (A));
452 }
453
454private:
456 static const TCHAR* DefaultErrorContext(ResultEnum InResult)
457 {
458 return (InResult == ResultEnum::Success ? TEXT("") : ToCStr(LexToString(InResult)));
459 }
460};
461
469#define DECLARE_NETRESULT_ENUM(EnumType) \
470 namespace UE \
471 { \
472 namespace Net \
473 { \
474 inline void AddToChainResultPtr(TPimplPtr<FNetResult, EPimplPtrMode::DeepCopy>& ResultPtr, TNetResult<EnumType>&& Result) { AddToChainResultPtr(ResultPtr, static_cast<FNetResult&&>(Result)); } \
475 inline FNetResult AddToAndConsumeChainResultPtr(TPimplPtr<FNetResult, EPimplPtrMode::DeepCopy>& ResultPtr, TNetResult<EnumType>&& Result) { return AddToAndConsumeChainResultPtr(ResultPtr, static_cast<FNetResult&&>(Result)); } \
476 } \
477 }
478
479}
480}
#define check(expr)
Definition AssertionMacros.h:314
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
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
const bool
Definition NetworkReplayStreaming.h:178
UEnum * StaticEnum()
constexpr uint32 HashCombine(uint32 A, uint32 C)
Definition TypeHash.h:36
UE_FORCEINLINE_HINT const UE_STRING_CLASS::ElementType * ToCStr(const UE_STRING_CLASS &Str)
Definition UnrealString.h.inl:2326
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
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Class.h:2791
Definition OverriddenPropertySet.cpp:45
Definition NetworkVersion.cpp:28
void NetResultToString(FString &OutResultStr, const TCHAR *LexResult, const FString &ErrorContext, ENetResultString ConversionType)
Definition NetResult.cpp:57
const TCHAR * LexToString(UE::Net::EStopReplicatingReason Reason)
Definition EngineReplicationBridge.cpp:121
FNetResult AddToAndConsumeChainResultPtr(TPimplPtr< FNetResult, EPimplPtrMode::DeepCopy > &ResultPtr, FNetResult &&Result)
Definition NetResult.h:308
void AddToChainResultPtr(TPimplPtr< FNetResult, EPimplPtrMode::DeepCopy > &ResultPtr, FNetResult &&Result)
Definition NetResult.h:289
TNetResult< T > * Cast(FNetResult *InResult)
Definition NetResult.h:120
ENetResultString
Definition NetResult.h:42
Definition AdvancedWidgetsModule.cpp:13
Definition IsEnum.h:7
Definition PimplPtr.h:50
Definition WeakObjectPtrTemplates.h:25
Definition NetResult.h:230
const FNetResult * operator->() const
Definition NetResult.h:248
void operator++()
Definition NetResult.h:253
FConstIterator(const FNetResult &InResult)
Definition NetResult.h:231
const FNetResult & operator*() const
Definition NetResult.h:241
Definition NetResult.h:64
FNetResult(FNetResult &&)=default
FNetResult & operator=(const FNetResult &)=default
void AddChainResult(FNetResult &&InResult)
Definition NetResult.h:171
NETCORE_API FString DynamicToString(ENetResultString ConversionType=ENetResultString::WithoutChain) const
Definition NetResult.cpp:17
FNetResult(const FNetResult &)=default
bool HasChainResult(ResultEnum A) const
Definition NetResult.h:211
FNetResult & operator=(FNetResult &&)=default
bool operator!=(const FNetResult &A) const
Definition NetResult.h:107
bool operator==(const FNetResult &A) const
Definition NetResult.h:101
friend const TNetResult< T > * Cast(const FNetResult *InResult)
Definition NetResult.h:139
friend uint32 GetTypeHash(FNetResult const &Hash)
Definition NetResult.h:160
friend TNetResult< T > * Cast(FNetResult *InResult)
Definition NetResult.h:120
void AddChainResult(TNetResult< T > &&InResult)
Definition NetResult.h:190
Definition NetResult.h:330
FString ToString(ENetResultString ConversionType=ENetResultString::WithoutChain) const
Definition NetResult.h:373
bool WasSuccessful() const
Definition NetResult.h:405
bool operator!=(ResultEnum A) const
Definition NetResult.h:449
bool operator==(ResultEnum A) const
Definition NetResult.h:444
bool HasChainResult(const TNetResult &A) const
Definition NetResult.h:428
TNetResult(ResultEnum InResult=ResultEnum::Unknown)
Definition NetResult.h:342
TNetResult(ResultEnum InResult, const FString &InErrorContext)
Definition NetResult.h:357
const FString & GetErrorContext() const
Definition NetResult.h:415
__underlying_type(ResultEnum) UnderlyingResultType
Definition NetResult.h:334
ResultEnum GetResult() const
Definition NetResult.h:410