1 // Copyright 2020 The Pigweed Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not 4 // use this file except in compliance with the License. You may obtain a copy of 5 // the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 // License for the specific language governing permissions and limitations under 13 // the License. 14 #pragma once 15 16 #include <cstdint> 17 18 #include "pw_protobuf/wire_format.h" 19 #include "pw_varint/varint.h" 20 21 namespace pw::protobuf { 22 23 // Field types that directly map to fixed wire types: 24 inline constexpr size_t kMaxSizeBytesFixed32 = 4; 25 inline constexpr size_t kMaxSizeBytesFixed64 = 8; 26 inline constexpr size_t kMaxSizeBytesSfixed32 = 4; 27 inline constexpr size_t kMaxSizeBytesSfixed64 = 8; 28 inline constexpr size_t kMaxSizeBytesFloat = kMaxSizeBytesFixed32; 29 inline constexpr size_t kMaxSizeBytesDouble = kMaxSizeBytesFixed64; 30 31 // Field types that map to varint: 32 inline constexpr size_t kMaxSizeBytesUint32 = varint::kMaxVarint32SizeBytes; 33 inline constexpr size_t kMaxSizeBytesUint64 = varint::kMaxVarint64SizeBytes; 34 inline constexpr size_t kMaxSizeBytesSint32 = varint::kMaxVarint32SizeBytes; 35 inline constexpr size_t kMaxSizeBytesSint64 = varint::kMaxVarint64SizeBytes; 36 // The int32 field type does not use zigzag encoding, ergo negative values 37 // can result in the worst case varint size. 38 inline constexpr size_t kMaxSizeBytesInt32 = varint::kMaxVarint64SizeBytes; 39 inline constexpr size_t kMaxSizeBytesInt64 = varint::kMaxVarint64SizeBytes; 40 // The bool field type is backed by a varint, but has a limited value range. 41 inline constexpr size_t kMaxSizeBytesBool = 1; 42 43 inline constexpr size_t kMaxSizeOfFieldKey = varint::kMaxVarint32SizeBytes; 44 45 inline constexpr size_t kMaxSizeOfLength = varint::kMaxVarint32SizeBytes; 46 SizeOfFieldKey(uint32_t field_number)47constexpr size_t SizeOfFieldKey(uint32_t field_number) { 48 // The wiretype is ignored as this does not impact the serialized size. 49 return varint::EncodedSize(field_number << kFieldNumberShift); 50 } 51 52 } // namespace pw::protobuf 53