Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nanopb/nanopb.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Nilsson <marco@zyax.se>2024-01-11 17:21:42 +0300
committerPetteri Aimonen <jpa@github.mail.kapsi.fi>2024-01-11 18:07:07 +0300
commitbfe9b68848110070ebadf88215740a6417dff6c8 (patch)
treeef8f775a7022fdc7b30fdac5b841d7a08c562230
parentcf26d28b88010dd3ac94e0cba64d4a71522154bc (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-xgenerator/nanopb_generator.py8
-rw-r--r--tests/cxx_descriptor/message_descriptor.cc3
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);