[Yunq] Explicitly specialize serialization template functions.
While this may end up with some duplicated code, it helps avoid accidentally generating code for a type that we didn't intend to. This will help in the future because we will get a linker error rather than wonky runtime behavior.
This commit is contained in:
parent
7ec4f696a8
commit
a71d5e9d24
|
@ -14,6 +14,12 @@ void Serializer::WriteHeader() {
|
||||||
buffer_.WriteAt<uint32_t>(offset_ + 12, 0); // TODO: Calculate CRC32.
|
buffer_.WriteAt<uint32_t>(offset_ + 12, 0); // TODO: Calculate CRC32.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
void Serializer::WriteField<uint64_t>(uint64_t field_index,
|
||||||
|
const uint64_t& value) {
|
||||||
|
buffer_.WriteAt<uint64_t>(field_offset(field_index), value);
|
||||||
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
void Serializer::WriteField<glcr::String>(uint64_t field_index,
|
void Serializer::WriteField<glcr::String>(uint64_t field_index,
|
||||||
const glcr::String& value) {
|
const glcr::String& value) {
|
||||||
|
@ -29,6 +35,23 @@ void Serializer::WriteField<glcr::String>(uint64_t field_index,
|
||||||
buffer_.WriteAt<ExtensionPointer>(field_offset(field_index), ptr);
|
buffer_.WriteAt<ExtensionPointer>(field_offset(field_index), ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
void Serializer::WriteRepeated<uint64_t>(uint64_t field_index,
|
||||||
|
const glcr::Vector<uint64_t>& value) {
|
||||||
|
ExtensionPointer ptr{
|
||||||
|
.offset = (uint32_t)next_extension_,
|
||||||
|
.length = (uint32_t)(value.size() * sizeof(uint64_t)),
|
||||||
|
};
|
||||||
|
|
||||||
|
next_extension_ += ptr.length;
|
||||||
|
buffer_.WriteAt<ExtensionPointer>(field_offset(field_index), ptr);
|
||||||
|
|
||||||
|
for (uint64_t i = 0; i < value.size(); i++) {
|
||||||
|
uint32_t ext_offset = offset_ + ptr.offset + (i * sizeof(uint64_t));
|
||||||
|
buffer_.WriteAt<uint64_t>(ext_offset, value.at(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Serializer::WriteCapability(uint64_t field_index, uint64_t value) {
|
void Serializer::WriteCapability(uint64_t field_index, uint64_t value) {
|
||||||
if (caps_) {
|
if (caps_) {
|
||||||
buffer_.WriteAt<uint64_t>(field_offset(field_index), next_cap_);
|
buffer_.WriteAt<uint64_t>(field_offset(field_index), next_cap_);
|
||||||
|
|
|
@ -55,30 +55,16 @@ class Serializer {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <>
|
||||||
void Serializer::WriteField(uint64_t field_index, const T& value) {
|
void Serializer::WriteField<uint64_t>(uint64_t field_index,
|
||||||
buffer_.WriteAt<T>(field_offset(field_index), value);
|
const uint64_t& value);
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
void Serializer::WriteField<glcr::String>(uint64_t field_index,
|
void Serializer::WriteField<glcr::String>(uint64_t field_index,
|
||||||
const glcr::String& value);
|
const glcr::String& value);
|
||||||
|
|
||||||
template <typename T>
|
template <>
|
||||||
void Serializer::WriteRepeated(uint64_t field_index,
|
void Serializer::WriteRepeated<uint64_t>(uint64_t field_index,
|
||||||
const glcr::Vector<T>& value) {
|
const glcr::Vector<uint64_t>& value);
|
||||||
ExtensionPointer ptr{
|
|
||||||
.offset = (uint32_t)next_extension_,
|
|
||||||
.length = (uint32_t)(value.size() * sizeof(T)),
|
|
||||||
};
|
|
||||||
|
|
||||||
next_extension_ += ptr.length;
|
|
||||||
buffer_.WriteAt<ExtensionPointer>(field_offset(field_index), ptr);
|
|
||||||
|
|
||||||
for (uint64_t i = 0; i < value.size(); i++) {
|
|
||||||
uint32_t ext_offset = offset_ + ptr.offset + (i * sizeof(T));
|
|
||||||
buffer_.WriteAt<T>(ext_offset, value.at(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace yunq
|
} // namespace yunq
|
||||||
|
|
Loading…
Reference in New Issue