diff options
Diffstat (limited to 'src/zencore/compactbinarybuilder.cpp')
| -rw-r--r-- | src/zencore/compactbinarybuilder.cpp | 43 |
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); } |