This commit is contained in:
J. Nick Koston 2025-07-09 22:20:49 -10:00
parent df72954c08
commit ab4a21e84d
No known key found for this signature in database
2 changed files with 36 additions and 28 deletions

View File

@ -164,67 +164,67 @@ void encode_bytes_field(ProtoWriteBuffer &buffer, const void *field_ptr, uint8_t
// Type-specific size calculation functions
void size_string_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *str = static_cast<const std::string *>(field_ptr);
ProtoSize::add_string_field(total_size, 1, *str, force);
ProtoSize::add_string_field(total_size, field_num, *str, force);
}
void size_fixed32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const uint32_t *>(field_ptr);
ProtoSize::add_fixed_field<4>(total_size, 1, *val != 0 || force, force);
ProtoSize::add_fixed_field<4>(total_size, field_num, *val != 0 || force, force);
}
void size_bool_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const bool *>(field_ptr);
ProtoSize::add_bool_field(total_size, 1, *val, force);
ProtoSize::add_bool_field(total_size, field_num, *val, force);
}
void size_float_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const float *>(field_ptr);
ProtoSize::add_fixed_field<4>(total_size, 1, *val != 0.0f || force, force);
ProtoSize::add_fixed_field<4>(total_size, field_num, *val != 0.0f || force, force);
}
void size_int32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const int32_t *>(field_ptr);
ProtoSize::add_int32_field(total_size, 1, *val, force);
ProtoSize::add_int32_field(total_size, field_num, *val, force);
}
void size_uint32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const uint32_t *>(field_ptr);
ProtoSize::add_uint32_field(total_size, 1, *val, force);
ProtoSize::add_uint32_field(total_size, field_num, *val, force);
}
void size_int64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const int64_t *>(field_ptr);
ProtoSize::add_int64_field(total_size, 1, *val, force);
ProtoSize::add_int64_field(total_size, field_num, *val, force);
}
void size_uint64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const uint64_t *>(field_ptr);
ProtoSize::add_uint64_field(total_size, 1, *val, force);
ProtoSize::add_uint64_field(total_size, field_num, *val, force);
}
void size_sint32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const int32_t *>(field_ptr);
ProtoSize::add_sint32_field(total_size, 1, *val, force);
ProtoSize::add_sint32_field(total_size, field_num, *val, force);
}
void size_sint64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const int64_t *>(field_ptr);
ProtoSize::add_sint64_field(total_size, 1, *val, force);
ProtoSize::add_sint64_field(total_size, field_num, *val, force);
}
void size_fixed64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const uint64_t *>(field_ptr);
ProtoSize::add_fixed_field<8>(total_size, 1, *val != 0 || force, force);
ProtoSize::add_fixed_field<8>(total_size, field_num, *val != 0 || force, force);
}
void size_double_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const double *>(field_ptr);
ProtoSize::add_fixed_field<8>(total_size, 1, *val != 0.0 || force, force);
ProtoSize::add_fixed_field<8>(total_size, field_num, *val != 0.0 || force, force);
}
void size_bytes_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *str = static_cast<const std::string *>(field_ptr);
ProtoSize::add_string_field(total_size, 1, *str, force);
ProtoSize::add_string_field(total_size, field_num, *str, force);
}
// Type-specific decode functions
@ -404,56 +404,56 @@ void encode_repeated_double_field(ProtoWriteBuffer &buffer, const void *field_pt
void size_repeated_string_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) {
const auto *vec = static_cast<const std::vector<std::string> *>(field_ptr);
for (const auto &item : *vec) {
ProtoSize::add_string_field(total_size, 1, item, true);
ProtoSize::add_string_field(total_size, field_num, item, true);
}
}
void size_repeated_bool_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) {
const auto *vec = static_cast<const std::vector<bool> *>(field_ptr);
for (bool val : *vec) {
ProtoSize::add_bool_field(total_size, 1, val, true);
ProtoSize::add_bool_field(total_size, field_num, val, true);
}
}
void size_repeated_uint32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) {
const auto *vec = static_cast<const std::vector<uint32_t> *>(field_ptr);
for (const auto &val : *vec) {
ProtoSize::add_uint32_field(total_size, 1, val, true);
ProtoSize::add_uint32_field(total_size, field_num, val, true);
}
}
void size_repeated_int32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) {
const auto *vec = static_cast<const std::vector<int32_t> *>(field_ptr);
for (const auto &val : *vec) {
ProtoSize::add_int32_field(total_size, 1, val, true);
ProtoSize::add_int32_field(total_size, field_num, val, true);
}
}
void size_repeated_uint64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) {
const auto *vec = static_cast<const std::vector<uint64_t> *>(field_ptr);
for (const auto &val : *vec) {
ProtoSize::add_uint64_field(total_size, 1, val, true);
ProtoSize::add_uint64_field(total_size, field_num, val, true);
}
}
void size_repeated_int64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) {
const auto *vec = static_cast<const std::vector<int64_t> *>(field_ptr);
for (const auto &val : *vec) {
ProtoSize::add_int64_field(total_size, 1, val, true);
ProtoSize::add_int64_field(total_size, field_num, val, true);
}
}
void size_repeated_sint32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) {
const auto *vec = static_cast<const std::vector<int32_t> *>(field_ptr);
for (const auto &val : *vec) {
ProtoSize::add_sint32_field(total_size, 1, val, true);
ProtoSize::add_sint32_field(total_size, field_num, val, true);
}
}
void size_repeated_sint64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) {
const auto *vec = static_cast<const std::vector<int64_t> *>(field_ptr);
for (const auto &val : *vec) {
ProtoSize::add_sint64_field(total_size, 1, val, true);
ProtoSize::add_sint64_field(total_size, field_num, val, true);
}
}
@ -461,7 +461,9 @@ void size_repeated_fixed32_field(uint32_t &total_size, const void *field_ptr, ui
const auto *vec = static_cast<const std::vector<uint32_t> *>(field_ptr);
size_t count = vec->size();
if (count > 0) {
total_size += count * (1 + 4); // field_id + 4 bytes per item
// Calculate proper field tag size
uint32_t tag_size = ProtoSize::varint(static_cast<uint32_t>((field_num << 3) | 5)); // wire type 5 for fixed32
total_size += count * (tag_size + 4); // field tag + 4 bytes per item
}
}
@ -469,7 +471,9 @@ void size_repeated_fixed64_field(uint32_t &total_size, const void *field_ptr, ui
const auto *vec = static_cast<const std::vector<uint64_t> *>(field_ptr);
size_t count = vec->size();
if (count > 0) {
total_size += count * (1 + 8); // field_id + 8 bytes per item
// Calculate proper field tag size
uint32_t tag_size = ProtoSize::varint(static_cast<uint32_t>((field_num << 3) | 1)); // wire type 1 for fixed64
total_size += count * (tag_size + 8); // field tag + 8 bytes per item
}
}
@ -477,7 +481,9 @@ void size_repeated_float_field(uint32_t &total_size, const void *field_ptr, uint
const auto *vec = static_cast<const std::vector<float> *>(field_ptr);
size_t count = vec->size();
if (count > 0) {
total_size += count * (1 + 4); // field_id + 4 bytes per item
// Calculate proper field tag size
uint32_t tag_size = ProtoSize::varint(static_cast<uint32_t>((field_num << 3) | 5)); // wire type 5 for float
total_size += count * (tag_size + 4); // field tag + 4 bytes per item
}
}
@ -485,7 +491,9 @@ void size_repeated_double_field(uint32_t &total_size, const void *field_ptr, uin
const auto *vec = static_cast<const std::vector<double> *>(field_ptr);
size_t count = vec->size();
if (count > 0) {
total_size += count * (1 + 8); // field_id + 8 bytes per item
// Calculate proper field tag size
uint32_t tag_size = ProtoSize::varint(static_cast<uint32_t>((field_num << 3) | 1)); // wire type 1 for double
total_size += count * (tag_size + 8); // field tag + 8 bytes per item
}
}

View File

@ -16,7 +16,7 @@ inline void encode_enum_field(ProtoWriteBuffer &buffer, const void *field_ptr, u
template<typename EnumType>
inline void size_enum_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) {
const auto *val = static_cast<const EnumType *>(field_ptr);
ProtoSize::add_enum_field(total_size, 1, static_cast<uint32_t>(*val), force);
ProtoSize::add_enum_field(total_size, field_num, static_cast<uint32_t>(*val), force);
}
template<typename EnumType> inline bool decode_enum_field(void *field_ptr, ProtoVarInt value) {
@ -47,14 +47,14 @@ template<typename EnumType>
inline void size_repeated_enum_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) {
const auto *vec = static_cast<const std::vector<EnumType> *>(field_ptr);
for (const auto &val : *vec) {
ProtoSize::add_enum_field(total_size, 1, static_cast<uint32_t>(val), true);
ProtoSize::add_enum_field(total_size, field_num, static_cast<uint32_t>(val), true);
}
}
template<typename MessageType>
inline void size_repeated_message_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) {
const auto *vec = static_cast<const std::vector<MessageType> *>(field_ptr);
ProtoSize::add_repeated_message<MessageType>(total_size, 1, *vec);
ProtoSize::add_repeated_message<MessageType>(total_size, field_num, *vec);
}
} // namespace api