UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
CompactBinaryWriter.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"
9#include "CoreTypes.h"
10#include "HAL/PlatformCrt.h"
11#include "Memory/MemoryFwd.h"
12#include "Memory/MemoryView.h"
14
15#include <type_traits>
16
18class FSharedBuffer;
19
21
22class FArchive;
23class FCbAttachment;
24class FName;
25struct FDateTime;
26struct FGuid;
27struct FIoHash;
28struct FTimespan;
29
68{
69public:
72
73 FCbWriter(const FCbWriter&) = delete;
74 FCbWriter& operator=(const FCbWriter&) = delete;
75
77 CORE_API void Reset();
78
86
97
106 CORE_API void Save(FArchive& Ar) const;
107
114
122
125 CORE_API void AddField(const FCbFieldView& Value);
128 CORE_API void AddField(const FCbField& Value);
129
132 CORE_API void BeginObject();
134 CORE_API void EndObject();
135
141 CORE_API void AddObject(const FCbObject& Value);
142
145 CORE_API void BeginArray();
147 CORE_API void EndArray();
148
151 CORE_API void AddArray(const FCbArrayView& Value);
154 CORE_API void AddArray(const FCbArray& Value);
155
158 CORE_API void AddNull();
159
162 CORE_API void AddBinary(const void* Value, uint64 Size);
165 inline void AddBinary(FMemoryView Value) { AddBinary(Value.GetData(), Value.GetSize()); }
171
178
191
194 CORE_API void AddFloat(float Value);
197 CORE_API void AddFloat(double Value);
198
200 inline void AddBool(FUtf8StringView Name, bool bValue) { SetName(Name); AddBool(bValue); }
201 CORE_API void AddBool(bool bValue);
202
210 inline void AddAttachment(FUtf8StringView Name, const FCbAttachment& Attachment) { SetName(Name); AddAttachment(Attachment); }
211 CORE_API void AddAttachment(const FCbAttachment& Attachment);
212
215 CORE_API void AddHash(const FIoHash& Value);
218 CORE_API void AddUuid(const FGuid& Value);
219
222 CORE_API void AddDateTimeTicks(int64 Ticks);
223
227
230 CORE_API void AddTimeSpanTicks(int64 Ticks);
231
235
239
241 inline void AddCustom(FUtf8StringView FieldName, uint64 TypeId, FMemoryView Value) { SetName(FieldName); AddCustom(TypeId, Value); }
243
245 inline void AddCustom(FUtf8StringView FieldName, FUtf8StringView TypeName, FMemoryView Value) { SetName(FieldName); AddCustom(TypeName, Value); }
247
249 enum class EStateFlags : uint8;
250
251protected:
253 CORE_API explicit FCbWriter(int64 InitialSize);
254
255private:
256
258 void BeginField();
259
261 void EndField(ECbFieldType Type);
262
264 CORE_API void SetNameOrAddString(FUtf8StringView NameOrValue);
265
267 FUtf8StringView GetActiveName() const;
268
270 void MakeFieldsUniform(int64 FieldBeginOffset, int64 FieldEndOffset);
271
273 struct FState
274 {
275 EStateFlags Flags{};
277 ECbFieldType UniformType{};
279 int64 Offset{};
281 uint64 Count{};
282 };
283
284private:
285 // This is a prototype-quality format for the writer. Using an array of bytes is inefficient,
286 // and will lead to many unnecessary copies and moves of the data to resize the array, insert
287 // object and array sizes, and remove field types for uniform objects and uniform arrays. The
288 // optimized format will be a list of power-of-two blocks and an optional first block that is
289 // provided externally, such as on the stack. That format will store the offsets that require
290 // object or array sizes to be inserted and field types to be removed, and will perform those
291 // operations only when saving to a buffer.
292 TArray64<uint8> Data;
293 TArray<FState> States;
294
295public:
298 {
299 SetNameOrAddString(NameOrValue);
300 return *this;
301 }
302
305 {
306 return *this << FAnsiStringView(NameOrValue);
307 }
308
311 {
312 return *this << FUtf8StringView(NameOrValue);
313 }
314
316 {
318 return *this;
319 }
320
322 {
324 return *this;
325 }
326
328 {
330 return *this;
331 }
332
334 {
336 return *this;
337 }
338
340 {
342 return *this;
343 }
344
346 {
348 return *this;
349 }
350
352 {
353 AddNull();
354 return *this;
355 }
356
358 {
360 return *this;
361 }
362
364 {
366 return *this;
367 }
368
370 {
372 return *this;
373 }
374
376 {
378 return *this;
379 }
380
382 {
384 return *this;
385 }
386
388 {
390 return *this;
391 }
392
393#if PLATFORM_LINUX || PLATFORM_APPLE
394 // On Unix-like platforms, size_t is an unsigned long, whereas UE defines uint64 as unsigned long long,
395 // making the two types immiscible for template resolution. However, SSIZE_T is currently defined as
396 // int64 (see FGenericPlatformTypes) and so no special overload is required for that type.
398 {
399 AddInteger(static_cast<uint64>(Value));
400 return *this;
401 }
402#endif
403
405 {
407 return *this;
408 }
409
410 inline FCbWriter& operator<<(double Value)
411 {
413 return *this;
414 }
415
417 {
418 AddBool(Value);
419 return *this;
420 }
421
422 inline FCbWriter& operator<<(const FCbAttachment& Attachment)
423 {
424 AddAttachment(Attachment);
425 return *this;
426 }
427
429 {
430 AddHash(Value);
431 return *this;
432 }
433
435 {
436 AddUuid(Value);
437 return *this;
438 }
439
442
444 {
446 return *this;
447 }
448
449 CORE_API FCbWriter& operator<<(const FString& Value);
453
454 template <typename T, typename Allocator,
455 std::void_t<decltype(std::declval<FCbWriter&>() << std::declval<const T&>())>* = nullptr>
456 inline FCbWriter& operator<<(const TArray<T, Allocator>& Value)
457 {
458 BeginArray();
459 for (const T& Element : Value)
460 {
461 *this << Element;
462 }
463 EndArray();
464 return *this;
465 }
466};
467
469
475template <uint32 InlineBufferSize>
476class TCbWriter : public FCbWriter
477{
478public:
479 inline TCbWriter()
481 {
482 }
483
484 TCbWriter(const TCbWriter&) = delete;
485 TCbWriter& operator=(const TCbWriter&) = delete;
486
487private:
488 // Reserve the inline buffer now even though we are unable to use it. This will avoid causing
489 // new stack overflows when this functionality is properly implemented in the future.
491};
492
ECbFieldType
Definition CompactBinary.h:102
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
FPlatformTypes::TYPE_OF_NULLPTR TYPE_OF_NULLPTR
The type of the C++ nullptr keyword.
Definition Platform.h:1157
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::UTF8CHAR UTF8CHAR
An 8-bit character containing a UTF8 (Unicode, 8-bit, variable-width) code unit.
Definition Platform.h:1137
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
TStringView< UTF8CHAR > FUtf8StringView
Definition StringFwd.h:48
TStringView< ANSICHAR > FAnsiStringView
Definition StringFwd.h:46
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition CompactBinary.h:942
Definition CompactBinary.h:1371
Definition CompactBinaryPackage.h:38
Definition CompactBinary.h:1288
Definition CompactBinary.h:892
Definition CompactBinary.h:610
Definition CompactBinary.h:1252
Definition CompactBinary.h:479
Definition CompactBinary.h:1025
Definition CompactBinary.h:1392
Definition CompactBinaryWriter.h:68
FCbWriter & operator<<(const ANSICHAR *NameOrValue)
Definition CompactBinaryWriter.h:304
FCbWriter & operator<<(int64 Value)
Definition CompactBinaryWriter.h:375
CORE_API void BeginObject()
Definition CompactBinaryWriter.cpp:254
FCbWriter & operator<<(uint64 Value)
Definition CompactBinaryWriter.h:387
CORE_API void BeginArray()
Definition CompactBinaryWriter.cpp:307
void AddObjectId(FUtf8StringView Name, const FCbObjectId &Value)
Definition CompactBinaryWriter.h:237
void AddBinaryAttachment(FUtf8StringView Name, const FIoHash &Value)
Definition CompactBinaryWriter.h:207
void AddObject(FUtf8StringView Name, const FCbObject &Value)
Definition CompactBinaryWriter.h:140
FCbWriter & operator<<(TYPE_OF_NULLPTR)
Definition CompactBinaryWriter.h:351
CORE_API void AddNull()
Definition CompactBinaryWriter.cpp:362
CORE_API uint64 GetSaveSize() const
Definition CompactBinaryWriter.cpp:126
FCbWriter & operator<<(const FCbFieldView &Value)
Definition CompactBinaryWriter.h:315
void AddFloat(FUtf8StringView Name, double Value)
Definition CompactBinaryWriter.h:196
CORE_API FCbWriter()
Definition CompactBinaryWriter.cpp:76
FCbWriter & operator<<(const FCbObjectId &Value)
Definition CompactBinaryWriter.h:443
void BeginArray(FUtf8StringView Name)
Definition CompactBinaryWriter.h:144
FCbWriter & operator<<(const FIoHash &Value)
Definition CompactBinaryWriter.h:428
FCbWriter & operator<<(const FCbAttachment &Attachment)
Definition CompactBinaryWriter.h:422
void AddBinary(FUtf8StringView Name, const void *Value, uint64 Size)
Definition CompactBinaryWriter.h:161
void AddBinary(FUtf8StringView Name, const FCompositeBuffer &Value)
Definition CompactBinaryWriter.h:169
void AddBinary(FUtf8StringView Name, const FSharedBuffer &Value)
Definition CompactBinaryWriter.h:167
FCbWriter & operator<<(const UTF8CHAR *NameOrValue)
Definition CompactBinaryWriter.h:310
void AddBinary(FUtf8StringView Name, FMemoryView Value)
Definition CompactBinaryWriter.h:164
void AddInteger(FUtf8StringView Name, uint64 Value)
Definition CompactBinaryWriter.h:189
FCbWriter(const FCbWriter &)=delete
FCbWriter & operator<<(int32 Value)
Definition CompactBinaryWriter.h:369
void AddInteger(FUtf8StringView Name, int32 Value)
Definition CompactBinaryWriter.h:180
FCbWriter & operator<<(const FCbArrayView &Value)
Definition CompactBinaryWriter.h:339
void AddDateTimeTicks(FUtf8StringView Name, int64 Ticks)
Definition CompactBinaryWriter.h:221
FCbWriter & operator<<(const FCbObject &Value)
Definition CompactBinaryWriter.h:333
FCbWriter & operator=(const FCbWriter &)=delete
CORE_API void Reset()
Definition CompactBinaryWriter.cpp:91
void AddField(FUtf8StringView Name, const FCbFieldView &Value)
Definition CompactBinaryWriter.h:124
FCbWriter & operator<<(FWideStringView Value)
Definition CompactBinaryWriter.h:357
CORE_API FCbFieldIterator Save() const
Definition CompactBinaryWriter.cpp:98
FCbWriter & operator<<(const FGuid &Value)
Definition CompactBinaryWriter.h:434
void AddUuid(FUtf8StringView Name, const FGuid &Value)
Definition CompactBinaryWriter.h:217
void AddString(FUtf8StringView Name, FUtf8StringView Value)
Definition CompactBinaryWriter.h:173
FCbWriter & operator<<(float Value)
Definition CompactBinaryWriter.h:404
void AddCustom(FUtf8StringView FieldName, FUtf8StringView TypeName, FMemoryView Value)
Definition CompactBinaryWriter.h:245
FCbWriter & operator<<(bool Value)
Definition CompactBinaryWriter.h:416
void AddBool(FUtf8StringView Name, bool bValue)
Definition CompactBinaryWriter.h:200
void AddFloat(FUtf8StringView Name, float Value)
Definition CompactBinaryWriter.h:193
FCbWriter & operator<<(const FCbObjectView &Value)
Definition CompactBinaryWriter.h:327
void AddTimeSpanTicks(FUtf8StringView Name, int64 Ticks)
Definition CompactBinaryWriter.h:229
FCbWriter & operator<<(const FCbField &Value)
Definition CompactBinaryWriter.h:321
void AddField(FUtf8StringView Name, const FCbField &Value)
Definition CompactBinaryWriter.h:127
void BeginObject(FUtf8StringView Name)
Definition CompactBinaryWriter.h:131
FCbWriter & operator<<(uint32 Value)
Definition CompactBinaryWriter.h:381
void AddNull(FUtf8StringView Name)
Definition CompactBinaryWriter.h:157
CORE_API void AddTimeSpan(FUtf8StringView Name, FTimespan Value)
Definition CompactBinaryWriter.cpp:564
void AddHash(FUtf8StringView Name, const FIoHash &Value)
Definition CompactBinaryWriter.h:214
FCbWriter & operator<<(const WIDECHAR *Value)
Definition CompactBinaryWriter.h:363
EStateFlags
Definition CompactBinaryWriter.cpp:27
void AddArray(FUtf8StringView Name, const FCbArray &Value)
Definition CompactBinaryWriter.h:153
FCbWriter & operator<<(FUtf8StringView NameOrValue)
Definition CompactBinaryWriter.h:297
CORE_API void EndObject()
Definition CompactBinaryWriter.cpp:261
CORE_API void AddDateTime(FUtf8StringView Name, FDateTime Value)
Definition CompactBinaryWriter.cpp:545
CORE_API void EndArray()
Definition CompactBinaryWriter.cpp:314
void AddObjectAttachment(FUtf8StringView Name, const FIoHash &Value)
Definition CompactBinaryWriter.h:204
void AddInteger(FUtf8StringView Name, int64 Value)
Definition CompactBinaryWriter.h:183
void AddBinary(FMemoryView Value)
Definition CompactBinaryWriter.h:165
void AddCustom(FUtf8StringView FieldName, uint64 TypeId, FMemoryView Value)
Definition CompactBinaryWriter.h:241
void AddInteger(FUtf8StringView Name, uint32 Value)
Definition CompactBinaryWriter.h:186
void AddString(FUtf8StringView Name, FWideStringView Value)
Definition CompactBinaryWriter.h:176
void AddObject(FUtf8StringView Name, const FCbObjectView &Value)
Definition CompactBinaryWriter.h:137
CORE_API ~FCbWriter()
Definition CompactBinaryWriter.cpp:87
FCbWriter & operator<<(const FCbArray &Value)
Definition CompactBinaryWriter.h:345
void AddArray(FUtf8StringView Name, const FCbArrayView &Value)
Definition CompactBinaryWriter.h:150
FCbWriter & operator<<(double Value)
Definition CompactBinaryWriter.h:410
CORE_API FCbWriter & SetName(FUtf8StringView Name)
Definition CompactBinaryWriter.cpp:174
void AddAttachment(FUtf8StringView Name, const FCbAttachment &Attachment)
Definition CompactBinaryWriter.h:210
Definition CompositeBuffer.h:27
Definition NameTypes.h:617
Definition SharedBuffer.h:341
Definition Array.h:670
Definition CompactBinaryWriter.h:477
TCbWriter()
Definition CompactBinaryWriter.h:479
TCbWriter & operator=(const TCbWriter &)=delete
TCbWriter(const TCbWriter &)=delete
@ Count
Definition AudioMixerDevice.h:90
const FVector Offset(0, 0, 20)
Definition DateTime.h:76
Definition Guid.h:109
Definition IoHash.h:33
Definition Timespan.h:76