UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
BitWriter.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
6#include "CoreTypes.h"
9#include "Misc/Build.h"
11
12class FArchive;
13
14/*-----------------------------------------------------------------------------
15 FBitWriter.
16-----------------------------------------------------------------------------*/
17
18//
19// Writes bitstreams.
20//
21struct FBitWriter : public FBitArchive
22{
23 friend struct FBitWriterMark;
24
25public:
29
34
39
40 CORE_API virtual void SerializeBits( void* Src, int64 LengthBits ) override;
41
42 CORE_API virtual void SerializeBitsWithOffset( void* Src, int32 SourceBit, int64 LengthBits ) override;
43
50 CORE_API virtual void SerializeInt(uint32& Value, uint32 Max) override;
51
52 CORE_API virtual void SerializeIntPacked(uint32& Value) override;
53
62
63 CORE_API void WriteBit( uint8 In );
64 CORE_API virtual void Serialize( void* Src, int64 LengthBytes ) override;
65
69 inline uint8* GetData(void)
70 {
71#if !UE_BUILD_SHIPPING
72 // If this happens, your code has insufficient IsError() checks.
73 check(!IsError());
74#endif
75
76 return Buffer.GetData();
77 }
78
79 inline const uint8* GetData(void) const
80 {
81#if !UE_BUILD_SHIPPING
82 // If this happens, your code has insufficient IsError() checks.
83 check(!IsError());
84#endif
85
86 return Buffer.GetData();
87 }
88
89 inline const TArray<uint8>* GetBuffer(void) const
90 {
91#if !UE_BUILD_SHIPPING
92 // If this happens, your code has insufficient IsError() checks.
93 check(!IsError());
94#endif
95
96 return &Buffer;
97 }
98
105 {
106 check(NumBits <= Max);
107 Num = NumBits;
108 }
109
114 {
115 return (Num+7)>>3;
116 }
117
122 {
123 return Num;
124 }
125
130 {
131 return Max;
132 }
133
140
145 {
146 bAllowOverflow = bInAllow;
147 }
148
150 {
151 //@TODO: FLOATPRECISION: This class pretends it is 64-bit aware, e.g., in the type of LengthBits and the Num/Max members, but it is not as the inner Buffer is a 32 bit TArray, etc...
152
153 if (Num+LengthBits > Max)
154 {
155 if (bAllowResize)
156 {
157 // Resize our buffer. The common case for resizing bitwriters is hitting the max and continuing to add a lot of small segments of data
158 // Though we could just allow the TArray buffer to handle the slack and resizing, we would still constantly hit the FBitWriter's max
159 // and cause this block to be executed, as well as constantly zeroing out memory inside AddZeroes (though the memory would be allocated
160 // in chunks).
161
162 Max = FMath::Max<int64>(Max<<1,Num+LengthBits);
163 int64 ByteMax = (Max+7)>>3;
164 Buffer.AddZeroed((int32)(ByteMax - Buffer.Num()));
165 check((Max+7)>>3== Buffer.Num());
166 return true;
167 }
168 else
169 {
170 return false;
171 }
172 }
173 return true;
174 }
175
177 {
178 bAllowResize = NewResize;
179 }
180
184 CORE_API void Reset() override;
185
187 {
188 Num = ( Num + 7 ) & ( ~0x07 );
189 }
190
192 CORE_API virtual void CountMemory(FArchive& Ar) const;
193
194private:
196 int64 Num;
197 int64 Max;
198 bool bAllowResize;
199
201 bool bAllowOverflow;
202};
203
204
205//
206// For pushing and popping FBitWriter positions.
207//
209{
210public:
211
213 : Overflowed(false)
214 , Num(0)
215 { }
216
218 {
219 Init(Writer);
220 }
221
223 {
224 return Num;
225 }
226
227 inline void Init( FBitWriter& Writer)
228 {
229 Num = Writer.Num;
230 Overflowed = Writer.IsError();
231 }
232
233 void Reset()
234 {
235 Overflowed = false;
236 Num = 0;
237 }
238
239 CORE_API void Pop( FBitWriter& Writer );
240 CORE_API void Copy( FBitWriter& Writer, TArray<uint8> &Buffer );
241
244 {
245 Writer.Num = Num;
246 }
247
248private:
249
250 bool Overflowed;
251 int64 Num;
252};
#define check(expr)
Definition AssertionMacros.h:314
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void Init()
Definition LockFreeList.h:4
@ Num
Definition MetalRHIPrivate.h:234
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
UE_FORCEINLINE_HINT bool IsError() const
Definition Archive.h:362
Definition BitArchive.h:13
Definition Array.h:670
@ false
Definition radaudio_common.h:23
Definition BitWriter.h:209
void Init(FBitWriter &Writer)
Definition BitWriter.h:227
void Reset()
Definition BitWriter.h:233
UE_FORCEINLINE_HINT void PopWithoutClear(FBitWriter &Writer)
Definition BitWriter.h:243
FBitWriterMark(FBitWriter &Writer)
Definition BitWriter.h:217
CORE_API void Pop(FBitWriter &Writer)
Definition BitWriter.cpp:287
UE_FORCEINLINE_HINT int64 GetNumBits() const
Definition BitWriter.h:222
FBitWriterMark()
Definition BitWriter.h:212
Definition BitWriter.h:22
UE_FORCEINLINE_HINT int64 GetNumBits(void) const
Definition BitWriter.h:121
CORE_API FBitWriter(FBitWriter &&)
CORE_API FBitWriter & operator=(FBitWriter &&)
const uint8 * GetData(void) const
Definition BitWriter.h:79
UE_FORCEINLINE_HINT void WriteAlign()
Definition BitWriter.h:186
void SetNumBits(int64 NumBits)
Definition BitWriter.h:104
CORE_API void WriteBit(uint8 In)
Definition BitWriter.cpp:205
virtual CORE_API void SerializeInt(uint32 &Value, uint32 Max) override
Definition BitWriter.cpp:142
CORE_API FBitWriter()
Definition BitWriter.cpp:49
uint8 * GetData(void)
Definition BitWriter.h:69
CORE_API void SetOverflowed(int32 LengthBits)
Definition BitWriter.cpp:219
const TArray< uint8 > * GetBuffer(void) const
Definition BitWriter.h:89
CORE_API FBitWriter & operator=(const FBitWriter &)
CORE_API FBitWriter(const FBitWriter &)
virtual CORE_API void SerializeBitsWithOffset(void *Src, int32 SourceBit, int64 LengthBits) override
Definition BitWriter.cpp:114
bool AllowAppend(int64 LengthBits)
Definition BitWriter.h:149
virtual CORE_API void CountMemory(FArchive &Ar) const
Definition BitWriter.cpp:230
virtual CORE_API void SerializeIntPacked(uint32 &Value) override
Definition BitWriter.cpp:245
CORE_API void Reset() override
Definition BitWriter.cpp:71
virtual CORE_API void SerializeBits(void *Src, int64 LengthBits) override
Definition BitWriter.cpp:84
UE_FORCEINLINE_HINT void SetAllowResize(bool NewResize)
Definition BitWriter.h:176
CORE_API void WriteIntWrapped(uint32 Value, uint32 ValueMax)
Definition BitWriter.cpp:181
UE_FORCEINLINE_HINT int64 GetMaxBits(void) const
Definition BitWriter.h:129
UE_FORCEINLINE_HINT int64 GetNumBytes(void) const
Definition BitWriter.h:113
virtual CORE_API ~FBitWriter()
UE_FORCEINLINE_HINT void SetAllowOverflow(bool bInAllow)
Definition BitWriter.h:144