aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/compactbinarybuilder.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2025-10-06 22:33:00 +0200
committerStefan Boberg <[email protected]>2025-10-06 22:33:00 +0200
commit1383dbdc563d90c170ab30ba622ee44e2e37e723 (patch)
tree59777db60000fe2ab2334f05776fb9ded4ca41fb /src/zencore/compactbinarybuilder.cpp
parentMerge branch 'main' into sb/rpc-analysis (diff)
parent5.7.6 (diff)
downloadzen-1383dbdc563d90c170ab30ba622ee44e2e37e723.tar.xz
zen-1383dbdc563d90c170ab30ba622ee44e2e37e723.zip
Merge remote-tracking branch 'origin/main' into sb/rpc-analysis
Diffstat (limited to 'src/zencore/compactbinarybuilder.cpp')
-rw-r--r--src/zencore/compactbinarybuilder.cpp43
1 files changed, 20 insertions, 23 deletions
diff --git a/src/zencore/compactbinarybuilder.cpp b/src/zencore/compactbinarybuilder.cpp
index 5c08d2e6e..63c0b9c5c 100644
--- a/src/zencore/compactbinarybuilder.cpp
+++ b/src/zencore/compactbinarybuilder.cpp
@@ -15,23 +15,21 @@
namespace zen {
-template<typename T>
uint64_t
-AddUninitialized(std::vector<T>& Vector, uint64_t Count)
+AddUninitialized(CbWriter::CbWriterData_t& Vector, uint64_t Count)
{
const uint64_t Offset = Vector.size();
Vector.resize(Offset + Count);
return Offset;
}
-template<typename T>
uint64_t
-Append(std::vector<T>& Vector, const T* Data, uint64_t Count)
+Append(CbWriter::CbWriterData_t& Vector, const uint8_t* Data, uint64_t Count)
{
const uint64_t Offset = Vector.size();
Vector.resize(Offset + Count);
- memcpy(Vector.data() + Offset, Data, sizeof(T) * Count);
+ memcpy(Vector.data() + Offset, Data, sizeof(uint8_t) * Count);
return Offset;
}
@@ -76,7 +74,7 @@ IsUniformType(const CbFieldType Type)
/** Append the payload from the compact binary value to the array and return its type. */
static inline CbFieldType
-AppendCompactBinary(const CbFieldView& Value, std::vector<uint8_t>& OutData)
+AppendCompactBinary(const CbFieldView& Value, CbWriter::CbWriterData_t& OutData)
{
struct FCopy : public CbFieldView
{
@@ -221,12 +219,11 @@ CbWriter::SetName(const std::string_view Name)
State.Flags |= StateFlags::Name;
const uint32_t NameLenByteCount = MeasureVarUInt(uint32_t(Name.size()));
const int64_t NameLenOffset = Data.size();
- Data.resize(NameLenOffset + NameLenByteCount);
+ Data.resize(NameLenOffset + NameLenByteCount + Name.size());
- WriteVarUInt(uint64_t(Name.size()), Data.data() + NameLenOffset);
+ WriteMeasuredVarUInt(uint64_t(Name.size()), NameLenByteCount, Data.data() + NameLenOffset);
- const uint8_t* NamePtr = reinterpret_cast<const uint8_t*>(Name.data());
- Data.insert(Data.end(), NamePtr, NamePtr + Name.size());
+ memcpy(Data.data() + NameLenOffset + NameLenByteCount, Name.data(), Name.size());
return *this;
}
@@ -341,7 +338,7 @@ CbWriter::EndObject()
const uint64_t Size = uint64_t(Data.size() - PayloadOffset);
const uint32_t SizeByteCount = MeasureVarUInt(Size);
Data.insert(Data.begin() + PayloadOffset, SizeByteCount, 0);
- WriteVarUInt(Size, Data.data() + PayloadOffset);
+ WriteMeasuredVarUInt(Size, SizeByteCount, Data.data() + PayloadOffset);
EndField(bUniform ? CbFieldType::UniformObject : CbFieldType::Object);
}
@@ -400,8 +397,8 @@ CbWriter::EndArray()
const uint64_t Size = uint64_t(Data.size() - PayloadOffset) + CountByteCount;
const uint32_t SizeByteCount = MeasureVarUInt(Size);
Data.insert(Data.begin() + PayloadOffset, SizeByteCount + CountByteCount, 0);
- WriteVarUInt(Size, Data.data() + PayloadOffset);
- WriteVarUInt(Count, Data.data() + PayloadOffset + SizeByteCount);
+ WriteMeasuredVarUInt(Size, SizeByteCount, Data.data() + PayloadOffset);
+ WriteMeasuredVarUInt(Count, CountByteCount, Data.data() + PayloadOffset + SizeByteCount);
EndField(bUniform ? CbFieldType::UniformArray : CbFieldType::Array);
}
@@ -429,13 +426,13 @@ CbWriter::AddNull()
void
CbWriter::AddBinary(const void* const Value, const uint64_t Size)
{
- const size_t SizeByteCount = MeasureVarUInt(Size);
+ const uint32_t SizeByteCount = MeasureVarUInt(Size);
Data.reserve(Data.size() + 1 + SizeByteCount + Size);
BeginField();
const size_t SizeOffset = Data.size();
- Data.resize(Data.size() + SizeByteCount);
- WriteVarUInt(Size, Data.data() + SizeOffset);
- Data.insert(Data.end(), static_cast<const uint8_t*>(Value), static_cast<const uint8_t*>(Value) + Size);
+ Data.resize(Data.size() + SizeByteCount + Size);
+ WriteMeasuredVarUInt(Size, SizeByteCount, Data.data() + SizeOffset);
+ memcpy(Data.data() + SizeOffset + SizeByteCount, Value, Size);
EndField(CbFieldType::Binary);
}
@@ -468,7 +465,7 @@ CbWriter::AddString(const std::string_view Value)
Data.resize(Offset + SizeByteCount + Size);
uint8_t* StringData = Data.data() + Offset;
- WriteVarUInt(Size, StringData);
+ WriteMeasuredVarUInt(Size, SizeByteCount, StringData);
StringData += SizeByteCount;
if (Size > 0)
{
@@ -489,7 +486,7 @@ CbWriter::AddString(const std::wstring_view Value)
const int64_t Offset = Data.size();
Data.resize(Offset + SizeByteCount + Size);
uint8_t* StringData = Data.data() + Offset;
- WriteVarUInt(Size, StringData);
+ WriteMeasuredVarUInt(Size, SizeByteCount, StringData);
StringData += SizeByteCount;
if (Size > 0)
{
@@ -511,7 +508,7 @@ CbWriter::AddInteger(const int32_t Value)
const uint32_t MagnitudeByteCount = MeasureVarUInt(Magnitude);
const int64_t Offset = Data.size();
Data.resize(Offset + MagnitudeByteCount);
- WriteVarUInt(Magnitude, Data.data() + Offset);
+ WriteMeasuredVarUInt(Magnitude, MagnitudeByteCount, Data.data() + Offset);
EndField(CbFieldType::IntegerNegative);
}
@@ -526,7 +523,7 @@ CbWriter::AddInteger(const int64_t Value)
const uint64_t Magnitude = ~uint64_t(Value);
const uint32_t MagnitudeByteCount = MeasureVarUInt(Magnitude);
const uint64_t Offset = AddUninitialized(Data, MagnitudeByteCount);
- WriteVarUInt(Magnitude, Data.data() + Offset);
+ WriteMeasuredVarUInt(Magnitude, MagnitudeByteCount, Data.data() + Offset);
EndField(CbFieldType::IntegerNegative);
}
@@ -537,7 +534,7 @@ CbWriter::AddInteger(const uint32_t Value)
BeginField();
const uint32_t ValueByteCount = MeasureVarUInt(Value);
const uint64_t Offset = AddUninitialized(Data, ValueByteCount);
- WriteVarUInt(Value, Data.data() + Offset);
+ WriteMeasuredVarUInt(Value, ValueByteCount, Data.data() + Offset);
EndField(CbFieldType::IntegerPositive);
}
@@ -548,7 +545,7 @@ CbWriter::AddInteger(const uint64_t Value)
BeginField();
const uint32_t ValueByteCount = MeasureVarUInt(Value);
const uint64_t Offset = AddUninitialized(Data, ValueByteCount);
- WriteVarUInt(Value, Data.data() + Offset);
+ WriteMeasuredVarUInt(Value, ValueByteCount, Data.data() + Offset);
EndField(CbFieldType::IntegerPositive);
}