116 lines
2.8 KiB
C++
116 lines
2.8 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "Storage/BlobWriter.h"
|
|
#include "Storage/RefOptions.h"
|
|
#include "IO/IoHash.h"
|
|
#include "../HordePlatform.h"
|
|
|
|
FBlobWriter::~FBlobWriter()
|
|
{
|
|
}
|
|
|
|
void FBlobWriter::AddRef(const FRefName& RefName)
|
|
{
|
|
AddRef(RefName, FRefOptions());
|
|
}
|
|
|
|
void* FBlobWriter::GetOutputBuffer(size_t Size)
|
|
{
|
|
return GetOutputBufferAsSpan(0, Size).GetData();
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------
|
|
|
|
HORDE_API void WriteBlobHandle(FBlobWriter& Writer, FBlobHandle Handle)
|
|
{
|
|
Writer.AddImport(MoveTemp(Handle));
|
|
}
|
|
|
|
HORDE_API void WriteBlobHandleWithHash(FBlobWriter& Writer, FBlobHandleWithHash Target)
|
|
{
|
|
Writer.AddImport(MoveTemp(Target.Handle));
|
|
WriteIoHash(Writer, Target.Hash);
|
|
}
|
|
|
|
HORDE_API void WriteIoHash(FBlobWriter& Writer, const FIoHash& Hash)
|
|
{
|
|
WriteFixedLengthBytes(Writer, &Hash, sizeof(Hash));
|
|
}
|
|
|
|
HORDE_API void WriteFixedLengthBytes(FBlobWriter& Writer, const void* Data, size_t Length)
|
|
{
|
|
void* Target = Writer.GetOutputBuffer(Length);
|
|
memcpy(Target, Data, Length);
|
|
Writer.Advance(Length);
|
|
}
|
|
|
|
HORDE_API void WriteFixedLengthBytes(FBlobWriter& Writer, const FMemoryView& View)
|
|
{
|
|
WriteFixedLengthBytes(Writer, View.GetData(), View.GetSize());
|
|
}
|
|
|
|
HORDE_API size_t MeasureUnsignedVarInt(size_t Value)
|
|
{
|
|
check(Value == (unsigned int)Value);
|
|
|
|
if (Value == 0)
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return (FHordePlatform::FloorLog2((unsigned int)Value) / 7) + 1;
|
|
}
|
|
}
|
|
|
|
HORDE_API size_t WriteUnsignedVarInt(void* Buffer, size_t Value)
|
|
{
|
|
size_t ByteCount = MeasureUnsignedVarInt(Value);
|
|
WriteUnsignedVarIntWithKnownLength(Buffer, Value, ByteCount);
|
|
return ByteCount;
|
|
}
|
|
|
|
HORDE_API void WriteUnsignedVarInt(FBlobWriter& Writer, size_t Value)
|
|
{
|
|
size_t ByteCount = MeasureUnsignedVarInt(Value);
|
|
WriteUnsignedVarIntWithKnownLength(Writer.GetOutputBuffer(ByteCount), Value, ByteCount);
|
|
Writer.Advance(ByteCount);
|
|
}
|
|
|
|
HORDE_API void WriteUnsignedVarIntWithKnownLength(void* Buffer, size_t Value, size_t NumBytes)
|
|
{
|
|
uint8* ByteBuffer = (uint8*)Buffer;
|
|
for (size_t Idx = 1; Idx < NumBytes; Idx++)
|
|
{
|
|
ByteBuffer[NumBytes - Idx] = (unsigned)Value;
|
|
Value >>= 8;
|
|
}
|
|
ByteBuffer[0] = (unsigned char)((0xff << (9 - (int)NumBytes)) | (unsigned char)Value);
|
|
}
|
|
|
|
HORDE_API size_t MeasureString(const char* Text)
|
|
{
|
|
return MeasureString(FUtf8StringView((const UTF8CHAR*)Text));
|
|
}
|
|
|
|
HORDE_API size_t MeasureString(const FUtf8StringView& Text)
|
|
{
|
|
return MeasureUnsignedVarInt(Text.Len()) + Text.Len();
|
|
}
|
|
|
|
HORDE_API void WriteString(FBlobWriter& Writer, const char* Text)
|
|
{
|
|
WriteString(Writer, FUtf8StringView(Text));
|
|
}
|
|
|
|
HORDE_API void WriteString(FBlobWriter& Writer, const FUtf8StringView& Text)
|
|
{
|
|
WriteUnsignedVarInt(Writer, Text.Len());
|
|
WriteFixedLengthBytes(Writer, Text.GetData(), Text.Len());
|
|
}
|
|
|
|
HORDE_API void WriteString(FBlobWriter& Writer, const FUtf8String& Text)
|
|
{
|
|
WriteString(Writer, FUtf8StringView(Text));
|
|
}
|