18#include "pw_protobuf/wire_format.h"
21namespace pw::protobuf {
26inline constexpr size_t kMaxSizeBytesFixed32 = 4;
27inline constexpr size_t kMaxSizeBytesFixed64 = 8;
28inline constexpr size_t kMaxSizeBytesSfixed32 = 4;
29inline constexpr size_t kMaxSizeBytesSfixed64 = 8;
30inline constexpr size_t kMaxSizeBytesFloat = kMaxSizeBytesFixed32;
31inline constexpr size_t kMaxSizeBytesDouble = kMaxSizeBytesFixed64;
43inline constexpr size_t kMaxSizeBytesBool = 1;
45inline constexpr size_t kMaxSizeBytesEnum = kMaxSizeBytesInt32;
61constexpr size_t TagSizeBytes(T field_number) {
62 static_assert((std::is_enum<T>() || std::is_integral<T>()) &&
63 sizeof(T) <=
sizeof(uint32_t),
64 "Field numbers must be 32-bit enums or integers");
68 FieldKey(
static_cast<uint32_t
>(field_number), WireType::kVarint));
72template <
typename T,
typename U>
73constexpr size_t SizeOfVarintField(T field_number, U value) {
74 return TagSizeBytes(field_number) +
83constexpr size_t SizeOfDelimitedFieldWithoutValue(
85 uint32_t length_bytes = std::numeric_limits<uint32_t>::max()) {
92constexpr size_t SizeOfDelimitedField(T field_number, uint32_t length_bytes) {
93 return SizeOfDelimitedFieldWithoutValue(field_number, length_bytes) +
113constexpr size_t SizeOfField(T field_number,
115 size_t data_size_bytes) {
116 if (type == WireType::kDelimited) {
117 PW_DASSERT(data_size_bytes <= std::numeric_limits<uint32_t>::max());
118 return SizeOfDelimitedField(field_number,
119 static_cast<uint32_t
>(data_size_bytes));
121 return TagSizeBytes(field_number) + data_size_bytes;
128constexpr size_t SizeOfFieldFloat(T field_number) {
129 return TagSizeBytes(field_number) +
sizeof(float);
132constexpr size_t SizeOfFieldDouble(T field_number) {
133 return TagSizeBytes(field_number) +
sizeof(double);
136constexpr size_t SizeOfFieldInt32(T field_number, int32_t value = -1) {
137 return SizeOfVarintField(field_number, value);
140constexpr size_t SizeOfFieldInt64(T field_number, int64_t value = -1) {
141 return SizeOfVarintField(field_number, value);
144constexpr size_t SizeOfFieldSint32(
145 T field_number, int32_t value = std::numeric_limits<int32_t>::min()) {
149constexpr size_t SizeOfFieldSint64(
150 T field_number, int64_t value = std::numeric_limits<int64_t>::min()) {
154constexpr size_t SizeOfFieldUint32(
155 T field_number, uint32_t value = std::numeric_limits<uint32_t>::max()) {
156 return SizeOfVarintField(field_number, value);
159constexpr size_t SizeOfFieldUint64(
160 T field_number, uint64_t value = std::numeric_limits<uint64_t>::max()) {
161 return SizeOfVarintField(field_number, value);
164constexpr size_t SizeOfFieldFixed32(T field_number) {
165 return TagSizeBytes(field_number) +
sizeof(uint32_t);
168constexpr size_t SizeOfFieldFixed64(T field_number) {
169 return TagSizeBytes(field_number) +
sizeof(uint64_t);
172constexpr size_t SizeOfFieldSfixed32(T field_number) {
173 return TagSizeBytes(field_number) +
sizeof(uint32_t);
176constexpr size_t SizeOfFieldSfixed64(T field_number) {
177 return TagSizeBytes(field_number) +
sizeof(uint64_t);
180constexpr size_t SizeOfFieldBool(T field_number) {
181 return TagSizeBytes(field_number) + 1;
184constexpr size_t SizeOfFieldString(T field_number, uint32_t length_bytes) {
185 return SizeOfDelimitedField(field_number, length_bytes);
188constexpr size_t SizeOfFieldBytes(T field_number, uint32_t length_bytes) {
189 return SizeOfDelimitedField(field_number, length_bytes);
191template <
typename T,
typename U =
int32_t>
192constexpr size_t SizeOfFieldEnum(T field_number, U value =
static_cast<U
>(-1)) {
193 static_assert((std::is_enum<U>() || std::is_integral<U>()) &&
194 sizeof(U) <=
sizeof(uint32_t),
195 "Enum values must be 32-bit enums or integers");
196 return SizeOfFieldInt32(field_number,
static_cast<int32_t
>(value));
constexpr size_t kMaxVarint32SizeBytes
Maximum size of a varint (LEB128) encoded uint32_t.
Definition: varint.h:74
constexpr std::make_unsigned_t< T > ZigZagEncode(T value)
Definition: varint.h:365
constexpr size_t kMaxVarint64SizeBytes
Maximum size of a varint (LEB128) encoded uint64_t.
Definition: varint.h:77
constexpr size_t EncodedSize(T value)
Computes the size of an integer when encoded as a varint.
Definition: varint.h:123