45 lines
1.3 KiB
C++
45 lines
1.3 KiB
C++
#include "serialize.h"
|
|
|
|
namespace yunq {
|
|
namespace {
|
|
|
|
const uint64_t kIdentByte = 0x33441122;
|
|
|
|
} // namespace
|
|
|
|
void Serializer::WriteHeader() {
|
|
buffer_.WriteAt<uint32_t>(offset_ + 0, kIdentByte);
|
|
buffer_.WriteAt<uint32_t>(offset_ + 4, core_size_);
|
|
buffer_.WriteAt<uint32_t>(offset_ + 8, next_extension_);
|
|
buffer_.WriteAt<uint32_t>(offset_ + 12, 0); // TODO: Calculate CRC32.
|
|
}
|
|
|
|
template <>
|
|
void Serializer::WriteField<glcr::String>(uint64_t field_index,
|
|
const glcr::String& value) {
|
|
ExtensionPointer ptr{
|
|
.offset = (uint32_t)next_extension_,
|
|
// FIXME: Check downcast of str length.
|
|
.length = (uint32_t)value.length(),
|
|
};
|
|
|
|
buffer_.WriteStringAt(offset_ + next_extension_, value);
|
|
next_extension_ += ptr.length;
|
|
|
|
buffer_.WriteAt<ExtensionPointer>(field_offset(field_index), ptr);
|
|
}
|
|
|
|
void Serializer::WriteCapability(uint64_t field_index, uint64_t value) {
|
|
if (caps_) {
|
|
buffer_.WriteAt<uint64_t>(field_offset(field_index), next_cap_);
|
|
caps_.value().get().WriteAt(next_cap_++, value);
|
|
} else {
|
|
WriteField<uint64_t>(field_index, value);
|
|
}
|
|
}
|
|
|
|
void Serializer::WriteRepeatedCapability(uint64_t field_index,
|
|
const glcr::Vector<uint64_t>& value) {}
|
|
|
|
} // namespace yunq
|