35 static inline uint32_t
varint(uint32_t value) {
44 }
else if (value < 2097152) {
46 }
else if (value < 268435456) {
59 static inline uint32_t
varint(uint64_t value) {
61 if (value <= UINT32_MAX) {
62 return varint(
static_cast<uint32_t
>(value));
66 if (value < (1ULL << 35)) {
68 }
else if (value < (1ULL << 42)) {
70 }
else if (value < (1ULL << 49)) {
72 }
else if (value < (1ULL << 56)) {
74 }
else if (value < (1ULL << 63)) {
90 static inline uint32_t
varint(int32_t value) {
97 return varint(
static_cast<uint32_t
>(value));
106 static inline uint32_t
varint(int64_t value) {
110 return varint(
static_cast<uint64_t
>(value));
120 static inline uint32_t
field(uint32_t field_id, uint32_t
type) {
121 uint32_t tag = (field_id << 3) | (
type & 0b111);
144 static inline void add_int32_field(uint32_t &total_size, uint32_t field_id_size, int32_t value,
bool force =
false) {
146 if (value == 0 && !force) {
153 total_size += field_id_size + 10;
156 total_size += field_id_size +
varint(
static_cast<uint32_t
>(value));
163 static inline void add_uint32_field(uint32_t &total_size, uint32_t field_id_size, uint32_t value,
164 bool force =
false) {
166 if (value == 0 && !force) {
171 total_size += field_id_size +
varint(value);
177 static inline void add_bool_field(uint32_t &total_size, uint32_t field_id_size,
bool value,
bool force =
false) {
179 if (!value && !force) {
184 total_size += field_id_size + 1;
195 template<u
int32_t NumBytes>
196 static inline void add_fixed_field(uint32_t &total_size, uint32_t field_id_size,
bool is_nonzero,
197 bool force =
false) {
199 if (!is_nonzero && !force) {
204 total_size += field_id_size + NumBytes;
212 static inline void add_enum_field(uint32_t &total_size, uint32_t field_id_size, uint32_t value,
bool force =
false) {
214 if (value == 0 && !force) {
219 total_size += field_id_size +
varint(value);
227 static inline void add_sint32_field(uint32_t &total_size, uint32_t field_id_size, int32_t value,
bool force =
false) {
229 if (value == 0 && !force) {
234 uint32_t zigzag = (
static_cast<uint32_t
>(value) << 1) ^ (
static_cast<uint32_t
>(value >> 31));
235 total_size += field_id_size +
varint(zigzag);
241 static inline void add_int64_field(uint32_t &total_size, uint32_t field_id_size, int64_t value,
bool force =
false) {
243 if (value == 0 && !force) {
248 total_size += field_id_size +
varint(value);
254 static inline void add_uint64_field(uint32_t &total_size, uint32_t field_id_size, uint64_t value,
255 bool force =
false) {
257 if (value == 0 && !force) {
262 total_size += field_id_size +
varint(value);
270 static inline void add_sint64_field(uint32_t &total_size, uint32_t field_id_size, int64_t value,
bool force =
false) {
272 if (value == 0 && !force) {
277 uint64_t zigzag = (
static_cast<uint64_t
>(value) << 1) ^ (
static_cast<uint64_t
>(value >> 63));
278 total_size += field_id_size +
varint(zigzag);
284 static inline void add_string_field(uint32_t &total_size, uint32_t field_id_size,
const std::string &str,
285 bool force =
false) {
287 if (str.empty() && !force) {
292 const uint32_t str_size =
static_cast<uint32_t
>(str.size());
293 total_size += field_id_size +
varint(str_size) + str_size;
304 static inline void add_message_field(uint32_t &total_size, uint32_t field_id_size, uint32_t nested_size,
305 bool force =
false) {
307 if (nested_size == 0 && !force) {
313 total_size += field_id_size +
varint(nested_size) + nested_size;
326 template<
typename MessageType>
327 static inline void add_message_object(uint32_t &total_size, uint32_t field_id_size,
const MessageType &message,
328 bool force =
false) {
329 uint32_t nested_size = 0;
330 message.calculate_size(nested_size);
345 template<
typename MessageType>
347 const std::vector<MessageType> &messages) {
349 if (messages.empty()) {
354 for (
const auto &message : messages) {
static uint32_t varint(uint64_t value)
Calculates the size in bytes needed to encode a uint64_t value as a varint.
static void add_sint64_field(uint32_t &total_size, uint32_t field_id_size, int64_t value, bool force=false)
Calculates and adds the size of a sint64 field to the total message size.
static void add_repeated_message(uint32_t &total_size, uint32_t field_id_size, const std::vector< MessageType > &messages)
Calculates and adds the sizes of all messages in a repeated field to the total message size.
static void add_uint32_field(uint32_t &total_size, uint32_t field_id_size, uint32_t value, bool force=false)
Calculates and adds the size of a uint32 field to the total message size.
static void add_bool_field(uint32_t &total_size, uint32_t field_id_size, bool value, bool force=false)
Calculates and adds the size of a boolean field to the total message size.
static void add_int32_field(uint32_t &total_size, uint32_t field_id_size, int32_t value, bool force=false)
Common parameters for all add_*_field methods.
static void add_int64_field(uint32_t &total_size, uint32_t field_id_size, int64_t value, bool force=false)
Calculates and adds the size of an int64 field to the total message size.
static void add_fixed_field(uint32_t &total_size, uint32_t field_id_size, bool is_nonzero, bool force=false)
Calculates and adds the size of a fixed field to the total message size.
static void add_message_object(uint32_t &total_size, uint32_t field_id_size, const MessageType &message, bool force=false)
Calculates and adds the size of a nested message field to the total message size.
static uint32_t varint(int64_t value)
Calculates the size in bytes needed to encode an int64_t value as a varint.
static uint32_t varint(uint32_t value)
ProtoSize class for Protocol Buffer serialization size calculation.
static void add_string_field(uint32_t &total_size, uint32_t field_id_size, const std::string &str, bool force=false)
Calculates and adds the size of a string/bytes field to the total message size.
static void add_message_field(uint32_t &total_size, uint32_t field_id_size, uint32_t nested_size, bool force=false)
Calculates and adds the size of a nested message field to the total message size.
static void add_uint64_field(uint32_t &total_size, uint32_t field_id_size, uint64_t value, bool force=false)
Calculates and adds the size of a uint64 field to the total message size.
static void add_sint32_field(uint32_t &total_size, uint32_t field_id_size, int32_t value, bool force=false)
Calculates and adds the size of a sint32 field to the total message size.
static uint32_t varint(int32_t value)
Calculates the size in bytes needed to encode an int32_t value as a varint.
static void add_enum_field(uint32_t &total_size, uint32_t field_id_size, uint32_t value, bool force=false)
Calculates and adds the size of an enum field to the total message size.
static uint32_t field(uint32_t field_id, uint32_t type)
Calculates the size in bytes needed to encode a field ID and wire type.
Providing packet encoding functions for exchanging data with a remote host.