Add message sizes to C++ wrappers.
This adds a max_size field referring to the C #define, indicating the maximum
encoded size of that message type. If the size cannot be determined, for
example due to non-bounded repeated fields, the constant is omitted.
This closes #932
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py
index 8a1dc5f..9f5cb63 100755
--- a/generator/nanopb_generator.py
+++ b/generator/nanopb_generator.py
@@ -1518,10 +1518,14 @@
return result
- def fields_declaration_cpp_lookup(self):
+ def fields_declaration_cpp_lookup(self, local_defines):
result = 'template <>\n'
result += 'struct MessageDescriptor<%s> {\n' % (self.name)
result += ' static PB_INLINE_CONSTEXPR const pb_size_t fields_array_length = %d;\n' % (self.count_all_fields())
+
+ if f"{self.name}_size" in local_defines:
+ result += ' static PB_INLINE_CONSTEXPR const pb_size_t max_size = %s_size;\n' % (self.name)
+
result += ' static inline const pb_msgdesc_t* fields() {\n'
result += ' return &%s_msg;\n' % (self.name)
result += ' }\n'
@@ -2167,7 +2171,7 @@
yield '/* Message descriptors for nanopb */\n'
yield 'namespace nanopb {\n'
for msg in self.messages:
- yield msg.fields_declaration_cpp_lookup() + '\n'
+ yield msg.fields_declaration_cpp_lookup(local_defines) + '\n'
yield '} // namespace nanopb\n'
yield '\n'
yield '#endif /* __cplusplus */\n'
diff --git a/tests/cxx_descriptor/message_descriptor.cc b/tests/cxx_descriptor/message_descriptor.cc
index 04c63b3..cbaae7e 100644
--- a/tests/cxx_descriptor/message_descriptor.cc
+++ b/tests/cxx_descriptor/message_descriptor.cc
@@ -19,6 +19,9 @@
TEST(MessageDescriptor<MyNonEmptyMessage>::fields_array_length ==
MyNonEmptyMessage_msg.field_count);
+ TEST(MessageDescriptor<MyNonEmptyMessage>::max_size ==
+ MyNonEmptyMessage_size);
+
TEST(MessageDescriptor<MyEmptyMessage>::fields() == MyEmptyMessage_fields);
TEST(MessageDescriptor<MyNonEmptyMessage>::fields() ==
MyNonEmptyMessage_fields);