UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Field.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Trace/Config.h"
6
7#if TRACE_PRIVATE_MINIMAL_ENABLED
8
9#include "Atomic.h"
10#include "Protocol.h"
12#include "Trace/Trace.h"
13#include "Writer.inl"
14
15/* Statically sized fields (e.g. UE_TRACE_EVENT_FIELD(float[4], Colours)) are
16 * not supported as yet. No call for them. The following define is used to track
17 * where and partially how to implement them */
18#define STATICALLY_SIZED_ARRAY_FIELDS_SUPPORT 0
19
20namespace UE {
21namespace Trace {
22
23namespace Private
24{
25
31
32class FEventNode;
33
34} // namespace Private
35
37enum DisabledField {};
38
39template <typename Type> struct TFieldType;
40
41template <> struct TFieldType<DisabledField>{ enum { Tid = 0, Size = 0 }; };
42template <> struct TFieldType<bool> { enum { Tid = int(EFieldType::Bool), Size = sizeof(bool) }; };
43template <> struct TFieldType<int8> { enum { Tid = int(EFieldType::Int8), Size = sizeof(int8) }; };
44template <> struct TFieldType<int16> { enum { Tid = int(EFieldType::Int16), Size = sizeof(int16) }; };
45template <> struct TFieldType<int32> { enum { Tid = int(EFieldType::Int32), Size = sizeof(int32) }; };
46template <> struct TFieldType<int64> { enum { Tid = int(EFieldType::Int64), Size = sizeof(int64) }; };
47template <> struct TFieldType<uint8> { enum { Tid = int(EFieldType::Uint8), Size = sizeof(uint8) }; };
48template <> struct TFieldType<uint16> { enum { Tid = int(EFieldType::Uint16), Size = sizeof(uint16) }; };
49template <> struct TFieldType<uint32> { enum { Tid = int(EFieldType::Uint32), Size = sizeof(uint32) }; };
50template <> struct TFieldType<uint64> { enum { Tid = int(EFieldType::Uint64), Size = sizeof(uint64) }; };
51template <> struct TFieldType<float> { enum { Tid = int(EFieldType::Float32),Size = sizeof(float) }; };
52template <> struct TFieldType<double> { enum { Tid = int(EFieldType::Float64),Size = sizeof(double) }; };
53template <class T> struct TFieldType<T*> { enum { Tid = int(EFieldType::Pointer),Size = sizeof(void*) }; };
54
55template <typename T>
56struct TFieldType<T[]>
57{
58 enum
59 {
60 Tid = int(TFieldType<T>::Tid)|int(EFieldType::Array),
61 Size = 0,
62 };
63};
64
65#if STATICALLY_SIZED_ARRAY_FIELDS_SUPPORT
66template <typename T, int N>
67struct TFieldType<T[N]>
68{
69 enum
70 {
71 Tid = int(TFieldType<T>::Tid)|int(EFieldType::Array),
72 Size = sizeof(T[N]),
73 };
74};
75#endif // STATICALLY_SIZED_ARRAY_FIELDS_SUPPORT
76
77template <> struct TFieldType<AnsiString> { enum { Tid = int(EFieldType::AnsiString), Size = 0, }; };
78template <> struct TFieldType<WideString> { enum { Tid = int(EFieldType::WideString), Size = 0, }; };
79
80
81
83struct FLiteralName
84{
85 template <uint32 Size>
86 explicit FLiteralName(const ANSICHAR (&Name)[Size])
87 : Ptr(Name)
88 , Length(Size - 1)
89 {
90 static_assert(Size < 256, "Field name is too large");
91 }
92
93 const ANSICHAR* Ptr;
95};
96
98struct FFieldDesc
99{
101 : Name(Name.Ptr)
102 , ValueOffset(Offset)
103 , ValueSize(Size)
104 , NameSize(Name.Length)
105 , TypeInfo(Type)
107 {
108 }
109
110 const ANSICHAR* Name;
111 uint16 ValueOffset;
112 uint16 ValueSize;
113 uint8 NameSize;
114 uint8 TypeInfo;
116};
117
118
119
121template <int InIndex, int InOffset, typename Type> struct TField;
122
123enum class EIndexPack
124{
125 NumFieldsMax = 1 << FAuxHeader::FieldBits,
126 NumFieldsShift = 8,
127 NumFieldsMask = (1 << NumFieldsShift) - 1,
129};
130
132#define TRACE_PRIVATE_FIELD(InIndex, InOffset, Type) \
133 enum \
134 { \
135 Index = InIndex, \
136 Offset = InOffset, \
137 Tid = TFieldType<Type>::Tid, \
138 Size = TFieldType<Type>::Size, \
139 }; \
140 static_assert((Index & int(EIndexPack::NumFieldsMask)) < int(EIndexPack::NumFieldsMax), "Trace events may only have up to EIndexPack::NumFieldsMax fields"); \
141 private: \
142 FFieldDesc FieldDesc; \
143 public: \
144 TField(const FLiteralName& Name) \
145 : FieldDesc(Name, Tid, Offset, Size) \
146 { \
147 }
148
150template <int InIndex, int InOffset, typename Type>
151struct TField<InIndex, InOffset, Type[]>
152{
153 TRACE_PRIVATE_FIELD(InIndex + int(EIndexPack::AuxFieldCounter), InOffset, Type[]);
154};
155
156#if STATICALLY_SIZED_ARRAY_FIELDS_SUPPORT
158template <int InIndex, int InOffset, typename Type, int Count>
159struct TField<InIndex, InOffset, Type[Count]>
160{
161 TRACE_PRIVATE_FIELD(InIndex, InOffset, Type[Count]);
162};
163#endif // STATICALLY_SIZED_ARRAY_FIELDS_SUPPORT
164
166template <int InIndex, int InOffset>
167struct TField<InIndex, InOffset, AnsiString>
168{
169 TRACE_PRIVATE_FIELD(InIndex + int(EIndexPack::AuxFieldCounter), InOffset, AnsiString);
170};
171
173template <int InIndex, int InOffset>
174struct TField<InIndex, InOffset, WideString>
175{
176 TRACE_PRIVATE_FIELD(InIndex + int(EIndexPack::AuxFieldCounter), InOffset, WideString);
177};
178
180template <int InIndex, int InOffset, typename DefinitionType>
181struct TField<InIndex, InOffset, TEventRef<DefinitionType>>
182{
184public:
185 TField(const FLiteralName& Name, uint32 ReferencedUid)
187 {
188 }
189};
190
192template <int InIndex, int InOffset, typename Type>
193struct TField
194{
195 TRACE_PRIVATE_FIELD(InIndex, InOffset, Type);
196};
197
198#undef TRACE_PRIVATE_FIELD
199
200
201
203// Used to terminate the field list and determine an event's size.
204enum EventProps {};
205template <int InNumFields, int InSize>
206struct TField<InNumFields, InSize, EventProps>
207{
208 enum : uint16
209 {
210 NumFields = InNumFields & int(EIndexPack::NumFieldsMask),
211 Size = InSize,
212 NumAuxFields = (InNumFields >> int(EIndexPack::NumFieldsShift)) & int(EIndexPack::NumFieldsMask),
213 };
214};
215
216} // namespace Trace
217} // namespace UE
218
219#endif // TRACE_PRIVATE_MINIMAL_ENABLED
FPlatformTypes::int16 int16
A 16-bit signed integer.
Definition Platform.h:1123
FPlatformTypes::int8 int8
An 8-bit signed integer.
Definition Platform.h:1121
FPlatformTypes::WIDECHAR WIDECHAR
A wide character. Normally a signed type.
Definition Platform.h:1133
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::ANSICHAR ANSICHAR
An ANSI character. Normally a signed type.
Definition Platform.h:1131
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
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
#define UE_TRACE_API
Definition Trace.h:13
uint32 Offset
Definition VulkanMemory.cpp:4033
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
@ Trace
Definition NetTraceConfig.h:23
Type
Definition PawnAction_Move.h:11
Definition OverriddenPropertySet.cpp:45
int
Definition TestServer.py:515
@ Reference
Definition Protocol6.h:40
AnsiString
Definition Trace.h:52
WideString
Definition Trace.h:53
Definition AdvancedWidgetsModule.cpp:13