[Yunq] Add support for repeated nested fields

This commit is contained in:
Drew Galbraith 2024-01-11 22:09:42 -08:00
parent 05f2403dc2
commit 9c860dd6a4
14 changed files with 207 additions and 61 deletions

View file

@ -41,6 +41,9 @@ class Serializer {
template <typename T>
void WriteMessage(uint64_t field_index, const T& value);
template <typename T>
void WriteRepeatedMessage(uint64_t field_index, const glcr::Vector<T>& value);
void WriteHeader();
uint64_t size() const { return next_extension_; }
@ -90,4 +93,32 @@ void Serializer::WriteMessage(uint64_t field_index, const T& value) {
buffer_.WriteAt<ExtensionPointer>(field_offset(field_index), ptr);
}
template <typename T>
void Serializer::WriteRepeatedMessage(uint64_t field_index,
const glcr::Vector<T>& value) {
uint64_t next_offset = next_extension_;
uint64_t length = 0;
for (T& message : value) {
uint64_t msg_length = 0;
if (caps_) {
msg_length = message.SerializeToBytes(buffer_, offset_ + next_offset,
caps_.value().get());
} else {
msg_length = message.SerializeToBytes(buffer_, offset_ + next_offset);
}
length += msg_length;
next_offset += msg_length;
}
ExtensionPointer ptr{
.offset = (uint32_t)next_extension_,
.length = (uint32_t)length,
};
next_extension_ += length;
buffer_.WriteAt<ExtensionPointer>(field_offset(field_index), ptr);
}
} // namespace yunq