UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MemoryView.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
9#include "Memory/MemoryFwd.h" // IWYU pragma: export
10#include "Templates/AndOrNot.h"
11#include "Templates/EnableIf.h"
12#include "Templates/Identity.h"
16
17#include <initializer_list>
18#include <type_traits>
19
27template <typename DataType>
29{
30 static_assert(std::is_void_v<DataType>, "DataType must be cv-qualified void");
31
32 using ByteType = std::conditional_t<std::is_const_v<DataType>, const uint8, uint8>;
33
34public:
36 constexpr TMemoryView() = default;
37
39 template <
40 typename OtherDataType
41 UE_REQUIRES(std::is_convertible_v<OtherDataType*, DataType*>)
42 >
44 : Data(InView.Data)
45 , Size(InView.Size)
46 {
47 }
48
50 constexpr inline TMemoryView(DataType* InData, uint64 InSize)
51 : Data(InData)
52 , Size(InSize)
53 {
54 }
55
57 template <
58 typename DataEndType
59 UE_REQUIRES(std::is_convertible_v<DataEndType*, DataType*>)
60 >
62 : Data(InData)
63 , Size(static_cast<uint64>(static_cast<ByteType*>(ImplicitConv<DataType*>(InDataEnd)) - static_cast<ByteType*>(InData)))
64 {
65 }
66
68 [[nodiscard]] constexpr inline DataType* GetData() const { return Data; }
69
71 [[nodiscard]] inline DataType* GetDataEnd() const { return GetDataAtOffsetNoCheck(Size); }
72
74 [[nodiscard]] constexpr inline uint64 GetSize() const { return Size; }
75
77 [[nodiscard]] constexpr inline bool IsEmpty() const { return Size == 0; }
78
80 constexpr inline void Reset() { *this = TMemoryView(); }
81
83 [[nodiscard]] constexpr inline TMemoryView Left(uint64 InSize) const
84 {
85 TMemoryView View(*this);
86 View.LeftInline(InSize);
87 return View;
88 }
89
91 [[nodiscard]] constexpr inline TMemoryView LeftChop(uint64 InSize) const
92 {
93 TMemoryView View(*this);
95 return View;
96 }
97
100 {
101 TMemoryView View(*this);
102 View.RightInline(InSize);
103 return View;
104 }
105
108 {
109 TMemoryView View(*this);
111 return View;
112 }
113
116 {
117 TMemoryView View(*this);
118 View.MidInline(InOffset, InSize);
119 return View;
120 }
121
123 constexpr inline void LeftInline(uint64 InSize)
124 {
125 Size = FMath::Min(Size, InSize);
126 }
127
129 constexpr inline void LeftChopInline(uint64 InSize)
130 {
131 Size -= FMath::Min(Size, InSize);
132 }
133
136 {
137 const uint64 OldSize = Size;
138 const uint64 NewSize = FMath::Min(OldSize, InSize);
139 Data = GetDataAtOffsetNoCheck(OldSize - NewSize);
140 Size = NewSize;
141 }
142
145 {
146 const uint64 Offset = FMath::Min(Size, InSize);
147 Data = GetDataAtOffsetNoCheck(Offset);
148 Size -= Offset;
149 }
150
153 {
154 RightChopInline(InOffset);
156 }
157
159 template <typename OtherDataType>
161 {
162 return Data <= InView.Data && GetDataAtOffsetNoCheck(Size) >= InView.GetDataAtOffsetNoCheck(InView.Size);
163 }
164
166 template <typename OtherDataType>
168 {
169 return Data < InView.GetDataAtOffsetNoCheck(InView.Size) && InView.Data < GetDataAtOffsetNoCheck(Size);
170 }
171
173 template <typename OtherDataType>
175 {
176 const int32 Compare = Data == InView.Data ? 0 : FMemory::Memcmp(Data, InView.Data, FMath::Min(Size, InView.Size));
177 return Compare || Size == InView.Size ? Compare : Size < InView.Size ? -1 : 1;
178 }
179
181 template <typename OtherDataType>
183 {
184 return Size == InView.Size && (Data == InView.Data || FMemory::Memcmp(Data, InView.Data, Size) == 0);
185 }
186
188 template <typename OtherDataType>
189 [[nodiscard]] constexpr inline bool Equals(const TMemoryView<OtherDataType>& InView) const
190 {
191 return Size == InView.Size && (Size == 0 || Data == InView.Data);
192 }
193
195 template <typename OtherDataType>
196 [[nodiscard]] constexpr inline bool operator==(const TMemoryView<OtherDataType>& InView) const
197 {
198 return Equals(InView);
199 }
200
202 template <typename OtherDataType>
203 [[nodiscard]] constexpr inline bool operator!=(const TMemoryView<OtherDataType>& InView) const
204 {
205 return !Equals(InView);
206 }
207
209 constexpr inline TMemoryView& operator+=(uint64 InOffset)
210 {
211 RightChopInline(InOffset);
212 return *this;
213 }
214
217 {
218 checkf(InView.Size <= Size, TEXT("Failed to copy from a view of %" UINT64_FMT " bytes "
219 "to a view of %" UINT64_FMT " bytes."), InView.Size, Size);
220 if (InView.Size)
221 {
222 FMemory::Memcpy(Data, InView.Data, InView.Size);
223 }
224 return RightChop(InView.Size);
225 }
226
227private:
229 [[nodiscard]] inline DataType* GetDataAtOffsetNoCheck(uint64 InOffset) const
230 {
231 return reinterpret_cast<ByteType*>(Data) + InOffset;
232 }
233
234 template <typename OtherDataType>
235 friend class TMemoryView;
236
237private:
238 DataType* Data = nullptr;
239 uint64 Size = 0;
240};
241
243template <typename DataType>
245{
246 return TMemoryView<DataType>(View) += Offset;
247}
248
250template <typename DataType>
252{
253 return TMemoryView<DataType>(View) += Offset;
254}
255
257[[nodiscard]] constexpr inline TMemoryView<void> MakeMemoryView(void* Data, uint64 Size)
258{
259 return TMemoryView<void>(Data, Size);
260}
261
263[[nodiscard]] constexpr inline TMemoryView<const void> MakeMemoryView(const void* Data, uint64 Size)
264{
265 return TMemoryView<const void>(Data, Size);
266}
267
269template <typename DataType, typename DataEndType>
270[[nodiscard]] inline auto MakeMemoryView(DataType* Data, DataEndType* DataEnd)
271{
272 // This function is templated on pointer type to prevent MakeMemoryView(Ptr, 0) being deduced as a null end pointer
273
274 using VoidType = std::conditional_t<std::is_const_v<DataType> || std::is_const_v<DataEndType>, const void, void>;
275
276 return TMemoryView<VoidType>(Data, DataEnd);
277}
278
284template <typename T>
285[[nodiscard]] constexpr inline TMemoryView<const void> MakeMemoryView(std::initializer_list<typename TIdentity<T>::Type> List)
286{
287 return TMemoryView<const void>(GetData(List), GetNum(List) * sizeof(T));
288}
289
291template <
292 typename ContainerType
294>
295[[nodiscard]] constexpr inline auto MakeMemoryView(ContainerType&& Container)
296{
297 using ElementType = typename TRemovePointer<decltype(GetData(DeclVal<ContainerType>()))>::Type;
298 constexpr bool bIsConst = std::is_const_v<ElementType>;
299 using DataType = std::conditional_t<bIsConst, const void, void>;
300 return TMemoryView<DataType>(GetData(Container), GetNum(Container) * sizeof(ElementType));
301}
302
303#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_7
304#include "Templates/IsConst.h"
305#endif
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define UINT64_FMT
Definition AndroidPlatformString.h:66
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
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
constexpr TMemoryView< void > MakeMemoryView(void *Data, uint64 Size)
Definition MemoryView.h:257
constexpr TMemoryView< DataType > operator+(const TMemoryView< DataType > &View, uint64 Offset)
Definition MemoryView.h:244
#define UE_REQUIRES(...)
Definition Requires.h:86
auto GetNum(const TStringConversion< Converter, DefaultConversionSize > &Conversion) -> decltype(Conversion.Length())
Definition StringConv.h:808
auto GetData(const TStringConversion< Converter, DefaultConversionSize > &Conversion) -> decltype(Conversion.Get())
Definition StringConv.h:802
UE_REWRITE constexpr T ImplicitConv(typename TIdentity< T >::Type Obj)
Definition UnrealTemplate.h:743
uint32 Offset
Definition VulkanMemory.cpp:4033
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition MemoryView.h:29
TMemoryView RightChop(uint64 InSize) const
Definition MemoryView.h:107
constexpr TMemoryView()=default
constexpr void LeftInline(uint64 InSize)
Definition MemoryView.h:123
bool Intersects(const TMemoryView< OtherDataType > &InView) const
Definition MemoryView.h:167
constexpr TMemoryView(const TMemoryView< OtherDataType > &InView)
Definition MemoryView.h:43
constexpr DataType * GetData() const
Definition MemoryView.h:68
constexpr TMemoryView Left(uint64 InSize) const
Definition MemoryView.h:83
constexpr TMemoryView LeftChop(uint64 InSize) const
Definition MemoryView.h:91
int32 CompareBytes(const TMemoryView< OtherDataType > &InView) const
Definition MemoryView.h:174
friend class TMemoryView
Definition MemoryView.h:235
DataType * GetDataEnd() const
Definition MemoryView.h:71
bool EqualBytes(const TMemoryView< OtherDataType > &InView) const
Definition MemoryView.h:182
constexpr TMemoryView(DataType *InData, uint64 InSize)
Definition MemoryView.h:50
void MidInline(uint64 InOffset, uint64 InSize=TNumericLimits< uint64 >::Max())
Definition MemoryView.h:152
constexpr bool IsEmpty() const
Definition MemoryView.h:77
TMemoryView Right(uint64 InSize) const
Definition MemoryView.h:99
constexpr bool Equals(const TMemoryView< OtherDataType > &InView) const
Definition MemoryView.h:189
TMemoryView(DataType *InData, DataEndType *InDataEnd)
Definition MemoryView.h:61
TMemoryView Mid(uint64 InOffset, uint64 InSize=TNumericLimits< uint64 >::Max()) const
Definition MemoryView.h:115
constexpr TMemoryView & operator+=(uint64 InOffset)
Definition MemoryView.h:209
bool Contains(const TMemoryView< OtherDataType > &InView) const
Definition MemoryView.h:160
constexpr bool operator==(const TMemoryView< OtherDataType > &InView) const
Definition MemoryView.h:196
constexpr void Reset()
Definition MemoryView.h:80
void RightChopInline(uint64 InSize)
Definition MemoryView.h:144
TMemoryView CopyFrom(FMemoryView InView) const
Definition MemoryView.h:216
constexpr uint64 GetSize() const
Definition MemoryView.h:74
void RightInline(uint64 InSize)
Definition MemoryView.h:135
constexpr void LeftChopInline(uint64 InSize)
Definition MemoryView.h:129
constexpr bool operator!=(const TMemoryView< OtherDataType > &InView) const
Definition MemoryView.h:203
static UE_FORCEINLINE_HINT int32 Memcmp(const void *Buf1, const void *Buf2, SIZE_T Count)
Definition UnrealMemory.h:114
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
T Type
Definition Identity.h:19
Definition IsContiguousContainer.h:16
Definition NumericLimits.h:41