diff options
author | Marco Nilsson <marco@zyax.se> | 2024-01-11 17:21:42 +0300 |
---|---|---|
committer | Petteri Aimonen <jpa@github.mail.kapsi.fi> | 2024-01-11 18:07:07 +0300 |
commit | bfe9b68848110070ebadf88215740a6417dff6c8 (patch) | |
tree | ef8f775a7022fdc7b30fdac5b841d7a08c562230 | |
parent | cf26d28b88010dd3ac94e0cba64d4a71522154bc (diff) |
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
-rwxr-xr-x | generator/nanopb_generator.py | 8 | ||||
-rw-r--r-- | tests/cxx_descriptor/message_descriptor.cc | 3 |
2 files changed, 9 insertions, 2 deletions
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 @@ class Message(ProtoElement): 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 @@ class ProtoFile: 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 @@ extern "C" int main() { 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); |