UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
BitPacking.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include <type_traits>
6
11#include "Templates/IsSigned.h"
12
13namespace UE::Net
14{
15
30
31/*
32 * All the SerializeUintDelta functions assume that the Value and PrevValue are representable using LargeBitCount. For SmallBitCountTable information see SerializeIntDelta.
33 * @see SerializeIntDelta
34 */
41
44
47
56
64
70
77
78
85template<typename T>
86inline bool SerializeSameValue(FNetBitStreamWriter& Writer, const T Value, const T OtherValue)
87{
88 const uint32 IsSameValue = (Value == OtherValue ? 1U : 0U);
89 Writer.WriteBits(IsSameValue, 1U);
90 return IsSameValue & 1;
91}
92
101template<typename T>
103{
104 const uint32 IsSameValue = Reader.ReadBits(1U);
105 if (IsSameValue)
106 {
108 return true;
109 }
110
111 return false;
112}
113
115inline void SerializeIntDelta(FNetBitStreamWriter& Writer, const T Value, const T PrevValue, const uint8* SmallBitCountTable, const uint32 SmallBitCountTableEntryCount, uint8 LargeBitCount)
116{
117 // Careful casting to properly represent negative numbers in the larger type as we want the delta between small negative numbers and small positive numbers to be small.
118 using SignedType = std::conditional_t<sizeof(T) == 8, int64, int32>;
120}
121
123inline void DeserializeIntDelta(FNetBitStreamReader& Reader, T& OutValue, const T PrevValue, const uint8* SmallBitCountTable, const uint32 SmallBitCountTableEntryCount, uint8 LargeBitCount)
124{
125 using SignedType = std::conditional_t<sizeof(T) == 8, int64, int32>;
126
129 OutValue = T(Value);
130}
131
133inline void SerializeUintDelta(FNetBitStreamWriter& Writer, const T Value, const T PrevValue, const uint8* SmallBitCountTable, const uint32 SmallBitCountTableEntryCount, uint8 LargeBitCount)
134{
135 // Careful casting to allow the delta between small positive numbers and large positive numbers to be small.
136 using UnsignedType = std::conditional_t<sizeof(T) == 8, uint64, uint32>;
138}
139
141inline void DeserializeUintDelta(FNetBitStreamReader& Reader, T& OutValue, const T PrevValue, const uint8* SmallBitCountTable, const uint32 SmallBitCountTableEntryCount, uint8 LargeBitCount)
142{
143 using UnsignedType = std::conditional_t<sizeof(T) == 8, uint64, uint32>;
144
145 UnsignedType Value;
147 OutValue = T(Value);
148}
149
150inline void SerializeSignedUnitFloat(FNetBitStreamWriter& Writer, uint32 Value, uint32 BitCount)
151{
152 if (BitCount < 24U)
153 {
154 Writer.WriteBits(Value, BitCount);
155 }
156 else
157 {
158 const uint32 SignAndIsNotZero = Value >> 23U;
159 Writer.WriteBits(SignAndIsNotZero, 2U);
160 if (SignAndIsNotZero & 1U)
161 {
162 Writer.WriteBits(Value, 23U);
163 }
164 }
165}
166
167inline uint32 DeserializeSignedUnitFloat(FNetBitStreamReader& Reader, uint32 BitCount)
168{
169 if (BitCount < 24U)
170 {
171 uint32 Value = Reader.ReadBits(BitCount);
172 // Sign-extend
173 const uint32 Mask = 1U << (BitCount - 1U);
174 Value = (Value ^ Mask) - Mask;
175 return Value;
176 }
177 else
178 {
179 const uint32 SignAndIsNotZero = Reader.ReadBits(2U);
181 if (SignAndIsNotZero & 1U)
182 {
183 Value |= Reader.ReadBits(23U);
184 }
185 return Value;
186 }
187}
188
189}
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::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
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition NetBitStreamReader.h:11
IRISCORE_API uint32 ReadBits(uint32 BitCount)
Definition NetBitStreamReader.cpp:54
Definition NetBitStreamWriter.h:11
IRISCORE_API void WriteBits(uint32 Value, uint32 BitCount)
Definition NetBitStreamWriter.cpp:59
Definition NetworkVersion.cpp:28
float DequantizeSignedUnitFloat(uint32 Value, uint32 BitCount)
Definition BitPacking.cpp:258
uint32 QuantizeSignedUnitFloat(float Value, uint32 BitCount)
Definition BitPacking.cpp:225
void DeserializeUintDelta(FNetBitStreamReader &Reader, uint32 &OutValue, const uint32 PrevValue, const uint8 *SmallBitCountTable, const uint32 SmallBitCountTableEntryCount, uint8 LargeBitCount)
Definition BitPacking.cpp:194
uint32 DeserializeSignedUnitFloat(FNetBitStreamReader &Reader, uint32 BitCount)
void SerializeUintDelta(FNetBitStreamWriter &Writer, const uint32 Value, const uint32 PrevValue, const uint8 *SmallBitCountTable, const uint32 SmallBitCountTableEntryCount, uint8 LargeBitCount)
Definition BitPacking.cpp:189
void SerializeIntDelta(FNetBitStreamWriter &Writer, const int32 Value, const int32 PrevValue, const uint8 *SmallBitCountTable, const uint32 SmallBitCountTableEntryCount, uint8 LargeBitCount)
Definition BitPacking.cpp:177
void DeserializeIntDelta(FNetBitStreamReader &Reader, int32 &OutValue, const int32 PrevValue, const uint8 *SmallBitCountTable, const uint32 SmallBitCountTableEntryCount, uint8 LargeBitCount)
Definition BitPacking.cpp:182
bool SerializeSameValue(FNetBitStreamWriter &Writer, const T Value, const T OtherValue)
Definition BitPacking.h:86
bool DeserializeSameValue(FNetBitStreamReader &Reader, T &OutValue, const T OtherValue)
Definition BitPacking.h:102
void SerializeSignedUnitFloat(FNetBitStreamWriter &Writer, uint32 Value, uint32 BitCount)
Definition IsIntegral.h:12