UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
IoBuffer.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Memory/MemoryView.h"
7
8template<typename T>
9class TIoStatusOr;
10
15{
16public:
18 enum ECloneTag { Clone };
19 enum EWrapTag { Wrap };
20
23 CORE_API FIoBuffer(const void* Data, uint64 InSize, const FIoBuffer& OuterBuffer);
24 CORE_API FIoBuffer(FMemoryView Memory, const FIoBuffer& OuterBuffer);
25
32
33 // Note: we currently rely on implicit move constructor, thus we do not declare any
34 // destructor or copy/assignment operators or copy constructors
35
36 inline const uint8* Data() const { return CorePtr->Data(); }
37 inline uint8* Data() { return CorePtr->Data(); }
38 inline const uint8* GetData() const { return CorePtr->Data(); }
39 inline uint8* GetData() { return CorePtr->Data(); }
40 inline uint64 DataSize() const { return CorePtr->DataSize(); }
41 inline uint64 GetSize() const { return CorePtr->DataSize(); }
42
43 inline FMemoryView GetView() const { return MakeMemoryView(CorePtr->Data(), CorePtr->DataSize()); }
44 inline FMutableMemoryView GetMutableView() { return MakeMemoryView(CorePtr->Data(), CorePtr->DataSize()); }
45
46 inline void SetSize(uint64 InSize) { return CorePtr->SetSize(InSize); }
47
48 inline bool IsMemoryOwned() const { return CorePtr->IsMemoryOwned(); }
49
50 inline void EnsureOwned() const { if (!CorePtr->IsMemoryOwned()) { MakeOwned(); } }
51
52 inline bool operator!=(const FIoBuffer& Rhs) const { return DataSize() != Rhs.DataSize() || FMemory::Memcmp(GetData(), Rhs.GetData(), DataSize()) != 0; }
53
54 CORE_API void MakeOwned() const;
55
68
69private:
74 struct BufCore
75 {
76 BufCore();
77 CORE_API ~BufCore();
78
79 explicit BufCore(uint64 InSize);
80 BufCore(const uint8* InData, uint64 InSize, bool InOwnsMemory);
81 BufCore(const uint8* InData, uint64 InSize, const BufCore* InOuter);
83
84 BufCore(const BufCore& Rhs) = delete;
85
86 BufCore& operator=(const BufCore& Rhs) = delete;
87
88 inline uint8* Data() { return DataPtr; }
89 inline uint64 DataSize() const { return DataSizeLow | (uint64(DataSizeHigh) << 32); }
90
91 //
92
93 CORE_API void SetDataAndSize(const uint8* InData, uint64 InSize);
94 CORE_API void SetSize(uint64 InSize);
95
96 void MakeOwned();
97
98 TIoStatusOr<uint8*> ReleaseMemory();
99
100 inline void SetIsOwned(bool InOwnsMemory)
101 {
102 if (InOwnsMemory)
103 {
104 Flags |= OwnsMemory;
105 }
106 else
107 {
109 }
110 }
111
112 inline uint32 AddRef() const
113 {
114 return uint32(FPlatformAtomics::InterlockedIncrement(&NumRefs));
115 }
116
117 inline uint32 Release() const
118 {
119#if DO_CHECK
120 CheckRefCount();
121#endif
122
123 const int32 Refs = FPlatformAtomics::InterlockedDecrement(&NumRefs);
124 if (Refs == 0)
125 {
126 delete this;
127 }
128
129 return uint32(Refs);
130 }
131
132 uint32 GetRefCount() const
133 {
134 return uint32(NumRefs);
135 }
136
137 bool IsMemoryOwned() const { return Flags & OwnsMemory; }
138
139 private:
140 CORE_API void CheckRefCount() const;
141
142 uint8* DataPtr = nullptr;
143
144 uint32 DataSizeLow = 0;
145 mutable int32 NumRefs = 0;
146
147 // Reference-counted outer "core", used for views into other buffer
148 //
149 // Ultimately this should probably just be an index into a pool
151
152 // TODO: These two could be packed in the MSB of DataPtr on x64
153 uint8 DataSizeHigh = 0; // High 8 bits of size (40 bits total)
154 uint8 Flags = 0;
155
156 enum
157 {
158 OwnsMemory = 1 << 0, // Buffer memory is owned by this instance
159 ReadOnlyBuffer = 1 << 1, // Buffer memory is immutable
160
161 FlagsMask = (1 << 2) - 1
162 };
163
164 void EnsureDataIsResident() {}
165
166 void ClearFlags()
167 {
168 Flags = 0;
169 }
170 };
171
172 // Reference-counted "core"
173 //
174 // Ultimately this should probably just be an index into a pool
175 TRefCountPtr<BufCore> CorePtr;
176
177 friend class FIoBufferManager;
178};
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
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition IoBuffer.h:15
FMutableMemoryView GetMutableView()
Definition IoBuffer.h:44
bool IsMemoryOwned() const
Definition IoBuffer.h:48
void EnsureOwned() const
Definition IoBuffer.h:50
uint64 DataSize() const
Definition IoBuffer.h:40
void SetSize(uint64 InSize)
Definition IoBuffer.h:46
EWrapTag
Definition IoBuffer.h:19
@ Wrap
Definition IoBuffer.h:19
bool operator!=(const FIoBuffer &Rhs) const
Definition IoBuffer.h:52
const uint8 * GetData() const
Definition IoBuffer.h:38
const uint8 * Data() const
Definition IoBuffer.h:36
CORE_API void MakeOwned() const
Definition IoBuffer.cpp:161
CORE_API TIoStatusOr< uint8 * > Release()
Definition IoBuffer.cpp:167
ECloneTag
Definition IoBuffer.h:18
@ Clone
Definition IoBuffer.h:18
FMemoryView GetView() const
Definition IoBuffer.h:43
uint64 GetSize() const
Definition IoBuffer.h:41
EAssumeOwnershipTag
Definition IoBuffer.h:17
@ AssumeOwnership
Definition IoBuffer.h:17
CORE_API FIoBuffer()
Definition IoBuffer.cpp:110
uint8 * GetData()
Definition IoBuffer.h:39
uint8 * Data()
Definition IoBuffer.h:37
friend class FIoBufferManager
Definition IoBuffer.h:177
Definition IoStatus.h:101
Definition RefCounting.h:454
Flags
Definition SoundFileIOEnums.h:78
@ Release
Definition PhysicsPublic.h:123
static UE_FORCEINLINE_HINT int32 Memcmp(const void *Buf1, const void *Buf2, SIZE_T Count)
Definition UnrealMemory.h:114