From 000cf6b5500621b5827c489b5e340e570238cc22 Mon Sep 17 00:00:00 2001 From: Dirk Thomas Date: Thu, 18 Jul 2019 10:44:00 -0700 Subject: [PATCH 1/2] remove the padding member from structs which should be empty Signed-off-by: Dirk Thomas --- rosidl_generator_py/resource/_msg.py.em | 16 ++++++++++++++++ rosidl_generator_py/resource/_msg_support.c.em | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/rosidl_generator_py/resource/_msg.py.em b/rosidl_generator_py/resource/_msg.py.em index f7b34f8e..24dd8a2a 100644 --- a/rosidl_generator_py/resource/_msg.py.em +++ b/rosidl_generator_py/resource/_msg.py.em @@ -18,6 +18,7 @@ from rosidl_parser.definition import BasicType from rosidl_parser.definition import BOOLEAN_TYPE from rosidl_parser.definition import BoundedSequence from rosidl_parser.definition import CHARACTER_TYPES +from rosidl_parser.definition import EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME from rosidl_parser.definition import FLOATING_POINT_TYPES from rosidl_parser.definition import INTEGER_TYPES from rosidl_parser.definition import NamespacedType @@ -187,12 +188,18 @@ class @(message.structure.namespaced_type.name)(metaclass=Metaclass_@(message.st __slots__ = [ @[for member in message.structure.members]@ +@[ if len(message.structure.members) == 1 and member.name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME]@ +@[ continue]@ +@[ end if]@ '_@(member.name)', @[end for]@ ] _fields_and_field_types = { @[for member in message.structure.members]@ +@[ if len(message.structure.members) == 1 and member.name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME]@ +@[ continue]@ +@[ end if]@ @{ type_ = member.type if isinstance(type_, AbstractNestedType): @@ -233,6 +240,9 @@ string@ SLOT_TYPES = ( @[for member in message.structure.members]@ +@[ if len(message.structure.members) == 1 and member.name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME]@ +@[ continue]@ +@[ end if]@ @{ type_ = member.type if isinstance(type_, AbstractNestedType): @@ -269,6 +279,9 @@ if isinstance(type_, AbstractNestedType): 'Invalid arguments passed to constructor: %s' % \ ', '.join(sorted(k for k in kwargs.keys() if '_' + k not in self.__slots__)) @[for member in message.structure.members]@ +@[ if len(message.structure.members) == 1 and member.name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME]@ +@[ continue]@ +@[ end if]@ @{ type_ = member.type if isinstance(type_, AbstractNestedType): @@ -374,6 +387,9 @@ if isinstance(type_, AbstractNestedType): from copy import copy return copy(cls._fields_and_field_types) @[for member in message.structure.members]@ +@[ if len(message.structure.members) == 1 and member.name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME]@ +@[ continue]@ +@[ end if]@ @{ type_ = member.type diff --git a/rosidl_generator_py/resource/_msg_support.c.em b/rosidl_generator_py/resource/_msg_support.c.em index be77ea59..0d57014a 100644 --- a/rosidl_generator_py/resource/_msg_support.c.em +++ b/rosidl_generator_py/resource/_msg_support.c.em @@ -9,6 +9,7 @@ from rosidl_parser.definition import AbstractString from rosidl_parser.definition import AbstractWString from rosidl_parser.definition import Array from rosidl_parser.definition import BasicType +from rosidl_parser.definition import EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME from rosidl_parser.definition import NamespacedType @@ -182,6 +183,10 @@ full_classname = '%s.%s.%s' % ('.'.join(message.structure.namespaced_type.namesp } @(msg_typename) * ros_message = _ros_message; @[for member in message.structure.members]@ +@[ if len(message.structure.members) == 1 and member.name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME]@ + ros_message->@(member.name) = 0; +@[ continue]@ +@[ end if]@ @{ type_ = member.type if isinstance(type_, AbstractNestedType): @@ -490,8 +495,15 @@ PyObject * @('__'.join(message.structure.namespaced_type.namespaces + [convert_c return NULL; } } +@[if len(message.structure.members) == 1 and member.name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME]@ + (void)raw_ros_message; +@[else]@ @(msg_typename) * ros_message = (@(msg_typename) *)raw_ros_message; +@[end if]@ @[for member in message.structure.members]@ +@[ if len(message.structure.members) == 1 and member.name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME]@ +@[ continue]@ +@[ end if]@ @{ type_ = member.type if isinstance(type_, AbstractNestedType): From d97cc46ee9892fa6b36e65970946de3b4c6cd3d0 Mon Sep 17 00:00:00 2001 From: Dirk Thomas Date: Thu, 18 Jul 2019 13:58:07 -0700 Subject: [PATCH 2/2] update __eq__ logic Signed-off-by: Dirk Thomas --- rosidl_generator_py/resource/_msg.py.em | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rosidl_generator_py/resource/_msg.py.em b/rosidl_generator_py/resource/_msg.py.em index 24dd8a2a..e2601916 100644 --- a/rosidl_generator_py/resource/_msg.py.em +++ b/rosidl_generator_py/resource/_msg.py.em @@ -373,6 +373,9 @@ if isinstance(type_, AbstractNestedType): if not isinstance(other, self.__class__): return False @[for member in message.structure.members]@ +@[ if len(message.structure.members) == 1 and member.name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME]@ +@[ continue]@ +@[ end if]@ @[ if isinstance(member.type, Array) and isinstance(member.type.value_type, BasicType) and member.type.value_type.typename in SPECIAL_NESTED_BASIC_TYPES]@ if all(self.@(member.name) != other.@(member.name)): @[ else]@