diff --git a/lib/yunq/serialize.cpp b/lib/yunq/serialize.cpp index 6522ab3..188685a 100644 --- a/lib/yunq/serialize.cpp +++ b/lib/yunq/serialize.cpp @@ -14,6 +14,12 @@ void Serializer::WriteHeader() { buffer_.WriteAt(offset_ + 12, 0); // TODO: Calculate CRC32. } +template <> +void Serializer::WriteField(uint64_t field_index, + const uint64_t& value) { + buffer_.WriteAt(field_offset(field_index), value); +} + template <> void Serializer::WriteField(uint64_t field_index, const glcr::String& value) { @@ -29,6 +35,23 @@ void Serializer::WriteField(uint64_t field_index, buffer_.WriteAt(field_offset(field_index), ptr); } +template <> +void Serializer::WriteRepeated(uint64_t field_index, + const glcr::Vector& value) { + ExtensionPointer ptr{ + .offset = (uint32_t)next_extension_, + .length = (uint32_t)(value.size() * sizeof(uint64_t)), + }; + + next_extension_ += ptr.length; + buffer_.WriteAt(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(ext_offset, value.at(i)); + } +} + void Serializer::WriteCapability(uint64_t field_index, uint64_t value) { if (caps_) { buffer_.WriteAt(field_offset(field_index), next_cap_); diff --git a/lib/yunq/serialize.h b/lib/yunq/serialize.h index ae6a77b..68f9775 100644 --- a/lib/yunq/serialize.h +++ b/lib/yunq/serialize.h @@ -55,30 +55,16 @@ class Serializer { } }; -template -void Serializer::WriteField(uint64_t field_index, const T& value) { - buffer_.WriteAt(field_offset(field_index), value); -} +template <> +void Serializer::WriteField(uint64_t field_index, + const uint64_t& value); template <> void Serializer::WriteField(uint64_t field_index, const glcr::String& value); -template -void Serializer::WriteRepeated(uint64_t field_index, - const glcr::Vector& value) { - ExtensionPointer ptr{ - .offset = (uint32_t)next_extension_, - .length = (uint32_t)(value.size() * sizeof(T)), - }; - - next_extension_ += ptr.length; - buffer_.WriteAt(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(ext_offset, value.at(i)); - } -} +template <> +void Serializer::WriteRepeated(uint64_t field_index, + const glcr::Vector& value); } // namespace yunq