pw_protobuf: Expose max_size, max_count in generated header file

For fields with max_size or max_count set in the codegen options,
generate a constant (static constexpr size_t) named k{FieldName}MaxSize
which is set to that size.

The constant is defined in the message namespace.

Use this constant in the Message struct field definitions
and in the calculation of kMaxEncodedSizeBytes.

For example, see this diff of the generated file
out/protocol_buffer/gen/pw_i2c/protos.proto_library/pwpb/pw_i2c/i2c.pwpb.h:

   namespace I2cWriteRequest {
   // ...
  +static constexpr size_t kRegisterAddressMaxSize = 4;
  +static constexpr size_t kValueMaxSize = 32;
   // ...
   }

   // ...

   struct I2cWriteRequest::Message {
     uint32_t bus_index;
     uint32_t target_address;
  -  ::pw::Vector<std::byte, 4> register_address;
  -  ::pw::Vector<std::byte, 32> value;
  +  ::pw::Vector<std::byte, kRegisterAddressMaxSize> register_address;
  +  ::pw::Vector<std::byte, kValueMaxSize> value;
     // ...
   };

   namespace I2cWriteRequest {
   inline constexpr size_t kMaxEncodedSizeBytes =
     ::pw::protobuf::SizeOfFieldUint32(static_cast<uint32_t>(Fields::kBusIndex)) +
     ::pw::protobuf::SizeOfFieldUint32(static_cast<uint32_t>(Fields::kTargetAddress)) +
  -  ::pw::protobuf::SizeOfDelimitedFieldWithoutValue(static_cast<uint32_t>(Fields::kRegisterAddress)) + 4 +
  -  ::pw::protobuf::SizeOfDelimitedFieldWithoutValue(static_cast<uint32_t>(Fields::kValue)) + 32;
  +  ::pw::protobuf::SizeOfDelimitedFieldWithoutValue(static_cast<uint32_t>(Fields::kRegisterAddress)) + kRegisterAddressMaxSize +
  +  ::pw::protobuf::SizeOfDelimitedFieldWithoutValue(static_cast<uint32_t>(Fields::kValue)) + kValueMaxSize;

   inline constexpr size_t kScratchBufferSizeBytes = 0;
   }  // namespace I2cWriteRequest

Test: ninja -C out
Bug: 297364973
Change-Id: I165da974e1e17699bd87ddb2311df4efb1808804
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/168973
Reviewed-by: Alexei Frolov <frolv@google.com>
Pigweed-Auto-Submit: Jonathon Reinhart <jrreinhart@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed-service-accounts.iam.gserviceaccount.com>
3 files changed
tree: b72792cc94ff50bd0cfadca93c02829159a09097
  1. .allstar/
  2. .vscode/
  3. build_overrides/
  4. docker/
  5. docs/
  6. pw_alignment/
  7. pw_allocator/
  8. pw_analog/
  9. pw_android_toolchain/
  10. pw_arduino_build/
  11. pw_assert/
  12. pw_assert_basic/
  13. pw_assert_log/
  14. pw_assert_tokenized/
  15. pw_assert_zephyr/
  16. pw_async/
  17. pw_async_basic/
  18. pw_base64/
  19. pw_bloat/
  20. pw_blob_store/
  21. pw_bluetooth/
  22. pw_bluetooth_hci/
  23. pw_bluetooth_profiles/
  24. pw_boot/
  25. pw_boot_cortex_m/
  26. pw_build/
  27. pw_build_info/
  28. pw_build_mcuxpresso/
  29. pw_bytes/
  30. pw_checksum/
  31. pw_chrono/
  32. pw_chrono_embos/
  33. pw_chrono_freertos/
  34. pw_chrono_stl/
  35. pw_chrono_threadx/
  36. pw_chrono_zephyr/
  37. pw_cli/
  38. pw_compilation_testing/
  39. pw_console/
  40. pw_containers/
  41. pw_cpu_exception/
  42. pw_cpu_exception_cortex_m/
  43. pw_crypto/
  44. pw_digital_io/
  45. pw_digital_io_mcuxpresso/
  46. pw_docgen/
  47. pw_doctor/
  48. pw_env_setup/
  49. pw_file/
  50. pw_function/
  51. pw_fuzzer/
  52. pw_hdlc/
  53. pw_hex_dump/
  54. pw_i2c/
  55. pw_i2c_linux/
  56. pw_i2c_mcuxpresso/
  57. pw_ide/
  58. pw_interrupt/
  59. pw_interrupt_cortex_m/
  60. pw_interrupt_xtensa/
  61. pw_interrupt_zephyr/
  62. pw_intrusive_ptr/
  63. pw_kvs/
  64. pw_libc/
  65. pw_log/
  66. pw_log_android/
  67. pw_log_basic/
  68. pw_log_null/
  69. pw_log_rpc/
  70. pw_log_string/
  71. pw_log_tokenized/
  72. pw_log_zephyr/
  73. pw_malloc/
  74. pw_malloc_freelist/
  75. pw_metric/
  76. pw_minimal_cpp_stdlib/
  77. pw_module/
  78. pw_multisink/
  79. pw_package/
  80. pw_perf_test/
  81. pw_persistent_ram/
  82. pw_polyfill/
  83. pw_preprocessor/
  84. pw_presubmit/
  85. pw_protobuf/
  86. pw_protobuf_compiler/
  87. pw_random/
  88. pw_result/
  89. pw_ring_buffer/
  90. pw_router/
  91. pw_rpc/
  92. pw_rpc_transport/
  93. pw_rust/
  94. pw_snapshot/
  95. pw_software_update/
  96. pw_span/
  97. pw_spi/
  98. pw_spi_mcuxpresso/
  99. pw_status/
  100. pw_stm32cube_build/
  101. pw_stream/
  102. pw_stream_shmem_mcuxpresso/
  103. pw_stream_uart_linux/
  104. pw_stream_uart_mcuxpresso/
  105. pw_string/
  106. pw_symbolizer/
  107. pw_sync/
  108. pw_sync_baremetal/
  109. pw_sync_embos/
  110. pw_sync_freertos/
  111. pw_sync_stl/
  112. pw_sync_threadx/
  113. pw_sync_zephyr/
  114. pw_sys_io/
  115. pw_sys_io_ambiq_sdk/
  116. pw_sys_io_arduino/
  117. pw_sys_io_baremetal_lm3s6965evb/
  118. pw_sys_io_baremetal_stm32f429/
  119. pw_sys_io_emcraft_sf2/
  120. pw_sys_io_mcuxpresso/
  121. pw_sys_io_pico/
  122. pw_sys_io_stdio/
  123. pw_sys_io_stm32cube/
  124. pw_sys_io_zephyr/
  125. pw_system/
  126. pw_target_runner/
  127. pw_thread/
  128. pw_thread_embos/
  129. pw_thread_freertos/
  130. pw_thread_stl/
  131. pw_thread_threadx/
  132. pw_thread_zephyr/
  133. pw_tls_client/
  134. pw_tls_client_boringssl/
  135. pw_tls_client_mbedtls/
  136. pw_tokenizer/
  137. pw_tool/
  138. pw_toolchain/
  139. pw_toolchain_bazel/
  140. pw_trace/
  141. pw_trace_tokenized/
  142. pw_transfer/
  143. pw_unit_test/
  144. pw_unit_test_zephyr/
  145. pw_varint/
  146. pw_watch/
  147. pw_web/
  148. pw_work_queue/
  149. seed/
  150. targets/
  151. third_party/
  152. ts/
  153. zephyr/
  154. .bazelignore
  155. .bazelrc
  156. .black.toml
  157. .clang-format
  158. .clang-tidy
  159. .eslintrc.cjs
  160. .git-blame-ignore-revs
  161. .gitattributes
  162. .gitignore
  163. .gn
  164. .mypy.ini
  165. .prettierignore
  166. .prettierrc.cjs
  167. .pw_ide.yaml
  168. .pylintrc
  169. activate.bat
  170. Android.bp
  171. AUTHORS
  172. bootstrap.bat
  173. bootstrap.sh
  174. BUILD.bazel
  175. BUILD.gn
  176. BUILDCONFIG.gn
  177. CMakeLists.txt
  178. jest.config.ts
  179. Kconfig.zephyr
  180. LICENSE
  181. modules.gni
  182. OWNERS
  183. package-lock.json
  184. package.json
  185. pigweed.json
  186. PIGWEED_MODULES
  187. README.md
  188. rollup.config.js
  189. tsconfig.json
  190. WORKSPACE
README.md

Pigweed

Pigweed is an open source collection of embedded-targeted libraries–or as we like to call them, modules. These modules are building blocks and infrastructure that enable faster and more reliable development on small-footprint MMU-less 32-bit microcontrollers like the STMicroelectronics STM32L452 or the Nordic nRF52832.

For more information please see our website: https://pigweed.dev/.

Links